2010-06-19 13 views
27

Tengo algún programa y cada vez que lo ejecuto arroja una excepción y no sé cómo comprobar exactamente qué arroja, así que mi pregunta es, ¿es posible detectar excepciones y imprimirla (he encontrado filas, que ha producido una excepción) gracias de antemanocómo detectar una excepción desconocida e imprimirla

Respuesta

32

Si se deriva de std::exception se puede tomar como referencia:

try 
{ 
    // code that could cause exception 
} 
catch (const std::exception &exc) 
{ 
    // catch anything thrown within try block that derives from std::exception 
    std::cerr << exc.what(); 
} 

Pero si la excepción es una clase que ha no se deriva de std::exception, Deberá saber con anticipación su tipo (es decir, si atrapa std::string o some_library_exception_base).

Usted puede hacer una captura todo:

try 
{ 
} 
catch (...) 
{ 
} 

pero entonces no se puede hacer nada con la excepción.

+0

@R Samuel Klatchko: muchas gracias, una pregunta más, ¿puedo usar su método para verificar las excepciones de nuevo y eliminar? – helloWorld

+0

@helloWorld - sí, esto captará las excepciones lanzadas desde 'new',' delete' y cualquier constructor o destructor llamado por ellos (siempre que la instrucción 'new' o' delete' esté dentro del bloque 'try'). –

+3

¿cómo debo solucionar mi problema si la excepción no se deriva de std :: exception? – javapowered

1

Pruebe lo sugerido por R Samuel Klatchko primero. Si eso no ayuda, hay algo más que podría ayudar:

a) Coloque un punto de interrupción en el tipo de excepción (manejado o no) si su depurador lo admite.

b) En algunos sistemas, el compilador genera una llamada a una función (¿indocumentada?) Cuando se ejecuta una instrucción throw. para averiguar qué función es para su sistema, escriba un programa hello world simple, que arroja y atrapa una excepción. inicie un depurador y coloque un punto de interrupción en el constructor de excepciones, y vea desde donde se está llamando. la función de llamada es probablemente algo así como __throw(). luego, inicie el depurador de nuevo con el programa que desea investigar como depuración. coloque un punto de interrupción en la función mencionada anteriormente (__throw o lo que sea) y ejecute el programa. cuando se lanza la excepción, el depurador se detiene y usted está allí para descubrir por qué.

11

En C++ 11 tiene: std::current_exception

código Ejemplo de un sitio:

#include <iostream> 
#include <string> 
#include <exception> 
#include <stdexcept> 

void handle_eptr(std::exception_ptr eptr) // passing by value is ok 
{ 
    try { 
     if (eptr) { 
      std::rethrow_exception(eptr); 
     } 
    } catch(const std::exception& e) { 
     std::cout << "Caught exception \"" << e.what() << "\"\n"; 
    } 
} 

int main() 
{ 
    std::exception_ptr eptr; 
    try { 
     std::string().at(1); // this generates an std::out_of_range 
    } catch(...) { 
     eptr = std::current_exception(); // capture 
    } 
    handle_eptr(eptr); 
} // destructor for std::out_of_range called here, when the eptr is destructed 
0

Inspirado por Dawid Drozd respuesta:

incluyen esta cabecera #include <exception>

try 
{ 
    // The code that could throw 
} 
catch(...) 
{ 
    auto expPtr = std::current_exception(); 

    try 
    { 
     if(expPtr) std::rethrow_exception(expPtr); 
    } 
    catch(const std::exception& e) //it would not work if you pass by value 
    { 
     std::cout << e.what(); 
    } 
} 
Cuestiones relacionadas