Estoy teniendo un problema con un tester que mi aplicación se bloquea en la inicialización. He añadido más el registro y el manejo de excepciones, pero todavía se bloquea con el genérico «este programa ha dejado de funcionar» mensaje en lugar de disparo mi error de manipulación.

Dado mi main() se parece a esto y ha catch(...) bajo qué circunstancias sería esta no se activa?

try{
    simed::CArmApp app(0, cmd);
    for(bool done = false;!done;) 
    {
        done = !app.frame();
    }
} catch(const std::runtime_error &e){
    handleApplicationError(e.what());
    return -1;
} catch(...) {
    handleApplicationError("Unknown Error");
    return -999;
}

Mi código es la llamada a una biblioteca de hacer el renderizado de OpenGL, que es donde creo que las cosas van mal.

  • No estoy seguro de entender. ¿Cómo sabes que es una excepción no capturada?
  • Porque handleApplicationError no se llama (se plantea un cuadro de mensaje y mata a mi splashscreen, ninguno de estos está sucediendo)
  • Pero, ¿por qué no podía simplemente ser algún otro tipo de programa de choque?
  • Lo siento, no he entendido. A mi entender fue catch(...) debe dejarme recuperar el control de si algo va mal, o más bien me estaba preguntando en qué circunstancias, que no es cierto.
  • Ah, no. En C++, una excepción es un lenguaje de programación específico mecanismo. No es como un hardware excepción. Específicamente lo que tiene que usar un throw declaración de lanzar una excepción. Así, por ejemplo, cualquier tipo de comportamiento indefinido como puntero null eliminación de referencias, etc. en general no causa C++ excepción.
  • La respuesta a por los Monjes de direcciones de esto, creo yo.
  • «este programa ha dejado de funcionar» también puede indicar una recursión infinita o de rotura de una pila de llamadas. Aquellos que normalmente no genera ningún excepciones en todo. ¿Esto sólo sucede para el probador?
  • Es posible que algo es de plano causar que el programa termine. ¿Tienes un std::terminate_handler registrado? (Además de no controlada/unhandlable excepciones, std::terminar se puede llamar si algo malo sucede.)

InformationsquelleAutor Mr. Boy | 2014-05-08

4 Comentarios

  1. 15

    Si un C++ catch(...) bloque no es la captura de los errores, tal vez es debido a un error de Windows.

    En Windows existe un concepto llamado El Control Estructurado De Excepciones que es donde el sistema operativo plantea «excepciones» cuando pasan cosas malas como desreferenciar un puntero que no es válido, la división por cero, etc. Digo «excepciones», porque estas no son las excepciones de C++; más bien se trata de errores graves que Windows define en un C-estilo de la moda -, esto es debido a que Win32 fue escrito en C para las excepciones de C++ no fueron viables.

    Ver también:

    De actualización basado en los comentarios

    Si quieres C++ excepción de la entrega y SEH tal vez usted podría tratar de los siguientes (no probado) código:

    __try
    {
        try
        {
            //Your code here...
        }
        catch (std::exception& e)
        {
            //C++ exception handling
        }
    }
    __except(HandleStructuredException())
    {
        //SEH handling 
    }
    • Muy interesante, gracias. No es claro de inmediato cómo me tratan de implementar tanto – o más bien en mi código de ejemplo de cómo debería escribir para ser más seguro. Yo creo una 3ra parte lib es donde las cosas se están rompiendo – que lib lanza excepciones de C++, así que yo esperaba que pescaron tantos problemas para mí! Es posible que usted podría usar mi código como un ejemplo de qué hacer, como una respuesta perfecta?
    • He añadido el código de ejemplo, tal vez esto podría ser utilizado para la captura de los dos tipos de excepciones
    • puaj (tener que hacer esto, no tu código!) pero parece que esta es la solución
    • El control estructurado de excepciones (__try, __except, y __finally) y excepciones de C++ (try y catch) no pueden utilizarse en la misma función. Tenga en cuenta que se trata de muy raro que el manejo estructurado de excepciones es la cosa correcta de hacer.
  2. 6

    Hasta ahora lo sé, no puede ser, al menos, dos situaciones en las que catch(...), de hecho, no captura

    1. Más de 1 Excepción no controlada: cuando se produce una excepción antes de que previamente se produjo la excepción se maneja, entonces c++ no puede manejar, y la aplicación se bloquee.
    2. Lanzando una excepción que no está en la excepción de la especificación de lista: si cualquier método lanza una excepción que no está en la excepción lista de especificación (en cualquier), a continuación, unexpected se llama que llama abort.
    • +1, pero en el caso #1, no es simplemente un «crash» es una llamada a std::terminate.
    • a la derecha, de hecho por defecto terminate también llamada abort, así mismo como #2.
  3. 2

    Si se produce una excepción por el destructor de un objeto que es destruida como resultado de la pila de desenrollado para manejar una excepción diferente, el programa va a salir, catch(...) o no.

  4. 1

    Hacer que declarar los objetos globales?
    Si usted tiene cualquier objeto creado fuera de su bucle principal, que podría explicar por qué no se detecta ( no está en su try-catch ).

    También, sería posible mostrar un poco más de su aplicación? Un ejemplo mínimo?

    • Que debe ser un comentario…
    • Definitivamente estrellarse debido a algo que se llama desde el interior de ese bloque try/catch – me pongo de registro para probar el código que se está ejecutando y, a continuación, sólo se muere, pero ninguno de mis errores de manejo especial 🙁

Dejar respuesta

Please enter your comment!
Please enter your name here