2010-06-28 14 views
18

Si quiero escribir información útil en un archivo cada vez que capté una excepción catch-all, ¿cómo hacerlo?cómo recibir el mensaje de catch-all excepción

try 
{ 
    //call dll from other company 
} 
catch(...) 
{ 
    //how to write info to file here??????? 
} 
+2

¿Qué mensaje le gustaría obtener de la excepción? ¿Qué pasa si el objeto arrojado es un 'int'? Cuando 'atrapa (...) ', no sabe que la excepción capturada * tendrá * un mensaje. – jalf

+0

Esta pregunta me dio un pensamiento extraño (no funcionaría, pero sería divertido si lo hiciera): template catch (const T & ex) {...} No creo que pueda funcionar desde entonces las excepciones son más un mecanismo de tiempo de ejecución ... ¿o no? Los mecanismos de desenrollado de la pila implicados en lanzar una excepción y ramificarse al bloque de captura correcto me parecen mágicos. Quizás el bloque catch correcto para realizar una bifurcación aún se determine en tiempo de compilación, lo que explicaría una de las razones por las que es tan peligroso cruzar los límites del módulo. – stinky472

Respuesta

43

No puede obtener ninguna información del ... bloque de captura. Es por eso por lo general maneja excepciones de código como este:

try 
{ 
    // do stuff that may throw or fail 
} 
catch(const std::runtime_error& re) 
{ 
    // speciffic handling for runtime_error 
    std::cerr << "Runtime error: " << re.what() << std::endl; 
} 
catch(const std::exception& ex) 
{ 
    // speciffic handling for all exceptions extending std::exception, except 
    // std::runtime_error which is handled explicitly 
    std::cerr << "Error occurred: " << ex.what() << std::endl; 
} 
catch(...) 
{ 
    // catch any other errors (that we have no information about) 
    std::cerr << "Unknown failure occurred. Possible memory corruption" << std::endl; 
} 
6

No hay manera de saber nada acerca de la excepción específica en un cajón de sastre manejador. Lo mejor es que pueda detectar una excepción de clase base, como std :: exception, si es posible.

1

Creo que él quiere que sea de registro que se produjo un error, pero no necesita específicamente el error exacto (iba a escribir su propio texto de error en ese caso)

El enlace DumbCoder publicado anteriormente tiene en el tutorial que lo ayudará a obtener lo que está tratando de lograr.

3

No puede obtener más detalles. El objetivo de catch(...) es tener ese tipo de "No sé lo que puede suceder, así que coge lo que sea que se arroje". Por lo general, coloca catch(...) después de catch para los tipos de excepción conocidos.

8

Una excepción detectada es accesible por la función std :: current_exception(), que se define en < excepción >. Esto fue introducido en C++ 11.

std::exception_ptr current_exception(); 

Sin embargo, std :: exception_ptr es un tipo definido por la implementación, por lo que no puede llegar a los detalles de todos modos. typeid(current_exception()).name() le dice exception_ptr, no la excepción contenida. Entonces, lo único que puede hacer con él es std :: rethrow_exception(). (Esta función parece estar allí para estandarizar el catch-pass-and-rethrow en los hilos).

Cuestiones relacionadas