Exceção de captura no código
-
05-07-2019 - |
Pergunta
Eu estava tentando esse código para verificar se a exceção da divisão por zero está sendo capturada:
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;
}
Quando obedeci isso usando o VC6, o manipulador de captura foi executado e a saída foi "Exceção capturada". No entanto, quando eu compilei isso usando o VS2008, o programa travou sem executar o bloco de captura. Qual poderia ser o motivo da diferença?
Solução
Ativar manipulação de exceção estruturada em Projeto -> Propriedades -> Propriedades de configuração -> C/C ++ -> Geração de código -> Ativar exceções C ++.
Use uma tentativa, exceto. Idealmente, com um filtro que verifica o código da exceção, retorna a sinalização constante se quiser capturar. Eu pulei isso aqui, mas eu recomendo que você veja aqui Para exemplos do filtro.
#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;
}
Outras dicas
Você está capturando exceções geradas pela camada estruturada de manuseio de exceções (SEH) da Microsoft, que é uma coisa de sistema operacional específica para a Microsoft. Como Mykola sugeriu, pode ser necessário mexer com suas opções de compilador, mas lembre -se de que esse código não será portátil para outros sistemas operacionais ou mesmo para outros compiladores em execução no Windows.
Vá para as propriedades do seu projeto, em C/C ++, geração de código, você encontrará "Exceções de C ++". Altere esta opção para "Sim, com exceções seh"
Lembre -se de que você só poderá capturar esse tipo de exceção usando:
try {} catch(...) {}
(com as elipsis)__try {} __except() {}
(com um filtro adequado no__except
)- usando
SetUnhandledExceptionFilter()
Para valores válidos no __except
Veja aqui
No caso do Visual Studio, pode ser uma opção de compilador. Mas, por padrão, a exceção não será lançada.