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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top