Параметр /EH (модель обработки исключений)

Определяет модель обработки исключений, используемую компилятором, а также уничтожает объекты C++, которые выходят за пределы области действия в результате применения модели.Если параметр /EH не задан, компилятор перехватывает структурированные исключения и исключения C++, однако объекты C++, которые выходят за пределы области действия в результате применения модели, не уничтожаются.

/EH{s|a}[c][-]

Аргументы

  • a
    Модель обработки, в которой перехватываются асинхронные (структурированные) и синхронные (C++) исключения.

  • s
    Модель обработки, в которой перехватываются только исключения C++, а при использовании функций extern C предполагается возникновение исключений.

  • c
    При использовании с параметром s (/EHsc) перехватывает только исключения C++ и указывает компьютеру предполагать, что функции C extern никогда не создают исключение C++./EHca равно /EHa.

Заметки

Параметр /EHs используется для определения модели обработки синхронных исключений (обработка исключений C++ без структурированных исключений).При использовании параметра /EHs перехват асинхронных исключений с помощью предложения catch не выполняется.Кроме того, даже в случае обработки асинхронного исключения не будут уничтожены все объекты, принадлежащие области действия, в которой возникло такое исключение.При использовании параметра /EHs предложение catch(...) служит для перехвата только исключений C++.Исключения типа System.Exception, а также исключения, связанные с нарушением прав доступа, не перехватываются.

Параметр /EHa используется для определения модели обработки асинхронных исключений (обработка исключений C++ со структурированными исключениями)./EHa может привести к снижению производительности образа, поскольку компилятор не оптимизирует блок try настолько активно, даже если компилятор не видит отклонение.

Параметр /EHa следует использовать для перехвата исключений, созданных не посредством throw.В следующем примере возникает исключение:

// compiler_options_EHA.cpp
// compile with: /EHa
#include <iostream>
#include <excpt.h>
using namespace std;

void fail() {   // generates SE and attempts to catch it using catch(...)
   try {
      int i = 0, j = 1;
      j /= i;   // This will throw a SE (divide by zero).
      printf("%d", j); 
   }
   catch(...) {   // catch block will only be executed under /EHa
      cout<<"Caught an exception in catch(...)."<<endl;
   }
}

int main() {
   __try {
      fail(); 
   }

   // __except will only catch an exception here
   __except(EXCEPTION_EXECUTE_HANDLER) {   
   // if the exception was not caught by the catch(...) inside fail()
      cout << "An exception was caught in __except." << endl;
   }
}

При использовании параметра /EHc необходимо задать параметр /EHs или /EHa.При использовании параметра /clr (компиляция CLR) подразумевается использование параметра /EHa (выражение /clr /EHa является избыточным).При использовании параметра /EHs[c] после /clr возникает ошибка компилятора.В этом случае оптимизация не действует.В случае перехвата исключения компилятор вызывает деструктор класса или деструкторы объектов, которые находятся в той же области действия, что и исключение.Если исключение не перехватывается, деструкторы не выполняются.

Сведения об ограничениях, накладываемых на обработку исключений при использовании параметра /clr, см. в описании функции _set_se_translator.

Чтобы отменить установку этого параметра, используйте символ -.Например, выражение /EHsc- интерпретируется как /EHs /EHc- и эквивалентно выражению /EHs.

Дополнительные сведения см. в разделе Synchronous Exception Handling.

Установка данного параметра компилятора в среде разработки Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта.Дополнительные сведения см. в разделе Открытие свойств страниц проекта.

  2. Откройте папку C/C++.

  3. Выберите страницу свойств Создание кода.

  4. Измените значение свойства Включить C++ исключения.

Также можно выполнить следующие действия:

Установка данного параметра компилятора в среде разработки Visual Studio

  1. Откройте папку C/C++.

  2. Выберите страницу свойств Создание кода.

  3. Установите для свойства Включить C++ исключения значение Нет.

  4. Выберите страницу свойств Командная строка.

  5. Введите параметр компилятора в поле Дополнительные параметры.

Установка данного параметра компилятора программным способом

  • Дополнительные сведения см. в разделе ExceptionHandling.

См. также

Ссылки

Параметры компилятора

Настройка параметров компилятора

Спецификации исключений