Параметр /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
Откройте диалоговое окно Страницы свойств проекта.Дополнительные сведения см. в разделе Открытие свойств страниц проекта.
Откройте папку C/C++.
Выберите страницу свойств Создание кода.
Измените значение свойства Включить C++ исключения.
Также можно выполнить следующие действия:
Установка данного параметра компилятора в среде разработки Visual Studio
Откройте папку C/C++.
Выберите страницу свойств Создание кода.
Установите для свойства Включить C++ исключения значение Нет.
Выберите страницу свойств Командная строка.
Введите параметр компилятора в поле Дополнительные параметры.
Установка данного параметра компилятора программным способом
- Дополнительные сведения см. в разделе ExceptionHandling.