Перехват исключения в коде
-
05-07-2019 - |
Вопрос
Я пробовал этот фрагмент кода, чтобы проверить, перехватывается ли исключение деления на ноль:
int main(int argc, char* argv[])
{
try
{
//Divide by zero
int k = 0;
int j = 8/k;
}
catch (...)
{
std::cout<<"Caught exception\n";
}
return 0;
}
Когда я выполнил это с помощью VC6, был выполнен обработчик catch, и на выходе было «Пойманное исключение».Однако когда я скомпилировал это с помощью VS2008, программа вылетела без выполнения блока catch.В чем может быть причина разницы?
Решение
Включить обработку структурированных исключений в проекте - > свойства - > свойства конфигурации - > c / c ++ - > генерация кода - > включить исключения C ++.
Попробуйте, кроме. В идеале с фильтром, который проверяет код исключения, а затем возвращает постоянную сигнализацию, если он хочет перехватить. Я пропустил это здесь, но я рекомендую вам увидеть здесь для примеров фильтра.
#include <iostream>
#include <windows.h>
int main(int argc, char* argv[])
{
__try
{
//Divide by zero
int k = 0;
int j = 8/k;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
if(GetExceptionCode()==EXCEPTION_INT_DIVIDE_BY_ZERO)
std::cout << "Caught int divison exception\n";
else
std::cout << "Caught exception\n";
system("pause");
}
return 0;
}
Другие советы
Вы ловите исключения, сгенерированные уровнем структурированной обработки исключений (SEH) Microsoft, который является специфической для Microsoft операционной системой. Как предположил Николай, вам, возможно, придется поработать с параметрами своего компилятора, но помните, что этот код не будет переносимым на другие операционные системы или даже на другие компиляторы, работающие в Windows.
Перейдите в свойства вашего проекта, в разделе C/C++, Генерация кода, вы найдете «Включить исключения C++».измените эту опцию на «Да, с исключениями SEH»
Имейте в виду, что вы сможете перехватывать такого рода исключения только с помощью:
try {} catch(...) {}
(с многоточием)__try {} __except() {}
(с соответствующим фильтром в__except
)- используя
SetUnhandledExceptionFilter()
Для действительных значений в __except
глянь сюда
В случае Visual Studio это могут быть параметры компилятора. Но по умолчанию исключение не будет выброшено.