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

Обновлен: Июль 2008

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

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

Аргументы

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

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

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

Заметки

Параметр /EHs используется для определения модели обработки синхронных исключений (обработка исключений C++ без структурированных исключений). При использовании параметра /EHs перехват асинхронных исключений с помощью предложения catch не выполняется. В Visual C++ 2005 даже в случае обработки асинхронного исключения не уничтожаются объекты, принадлежащие области действия, в которой возникло такое исключение. При использовании параметра /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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Ссылки

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

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

Exception Specifications

Журнал изменений

Дата

Журнал изменений

Причина

Июль 2008

Изменение описания, как параметр /EHa может создавать образ, снижающий производительность. Добавление последнего оператора к блоку try примера, чтобы не выполнялась ненужная оптимизация.

Улучшение информации.