Pregunta

Estaba intentando este código para verificar si se está detectando la excepción dividir por cero:

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;
}

Cuando cumplí esto usando VC6, se ejecutó el controlador catch y la salida fue "Excepción atrapada". Sin embargo, cuando compilé esto usando VS2008, el programa se bloqueó sin ejecutar el bloque catch. ¿Cuál podría ser la razón de la diferencia?

¿Fue útil?

Solución

Habilite el manejo estructurado de excepciones en el proyecto - > propiedades - > propiedades de configuración - > c / c ++ - > generación de código - > habilitar excepciones de c ++.

Use una prueba excepto. Idealmente con un filtro que verifica el código de excepción y luego devuelve la señalización constante si le gustaría atraparlo. Lo he omitido aquí, pero le recomiendo que vea aquí para ver ejemplos del 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;
}

Otros consejos

Está detectando excepciones generadas por la capa de manejo de excepciones estructuradas (SEH) de Microsoft, que es un elemento del sistema operativo específico de Microsoft. Como sugirió Mykola, es posible que deba manipular las opciones de su compilador, pero tenga en cuenta que este código no será portátil para otros sistemas operativos o incluso para otros compiladores que se ejecutan en Windows.

Vaya a las propiedades de su proyecto, en C / C ++, Generación de código, encontrará " Habilitar excepciones de C ++ " cambie esta opción a "Sí, con excepciones de SEH"

Tenga en cuenta que solo podrá capturar este tipo de excepciones utilizando:

  • intente {} captura (...) {} (con los puntos suspensivos)
  • __try {} __except () {} (con un filtro adecuado en el __except )
  • mediante SetUnhandledExceptionFilter()

Para valores válidos en __except ver aquí

En el caso de Visual Studio puede ser una opción de compilador. Pero por norma no se lanzará la excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top