2010-06-28 1 views
18

Se voglio scrivere informazioni utili su un file ogni volta che ho preso un'eccezione catch-all, come farlo?come ottenere il messaggio di eccezione catch-all

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

Quale messaggio desideri uscire dall'eccezione? Cosa succede se l'oggetto lanciato è un 'int'? Quando prendi (...) ', non sai che l'eccezione catturata avrà * un * messaggio. – jalf

+0

Questa domanda mi ha dato un pensiero strano (non avrebbe funzionato, ma sarebbe stata una cosa divertente se lo avesse fatto): modello catch (const T & ex) {...} Non penso che potrebbe funzionare dal le eccezioni sono più un meccanismo di runtime ... o potrebbe? I meccanismi di srotolamento dello stack coinvolti nel lancio di un'eccezione e della ramificazione sul blocco di blocco corretto mi sembrano davvero magici. Forse il blocco di catch corretto da ramificare è ancora determinato in fase di compilazione, il che spiegherebbe una delle ragioni per cui è così pericoloso attraversare i limiti del modulo. – stinky472

risposta

43

Non è possibile ottenere informazioni dal blocco di cattura. Questo è il motivo codice gestisce solito eccezioni come questo:

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

Non c'è modo di sapere nulla dell'eccezione specifica in un gestore catch-all. È meglio se puoi prendere un'eccezione di classe base, come std :: exception, se possibile.

1

Credo che voglia di farlo registrare che si è verificato un errore, ma non specificamente bisogno l'errore esatto (avrebbe scritto il suo testo di errore in questo caso).

Il link DumbCoder pubblicato sopra ha un tutorial che ti aiuterà a ottenere ciò che stai cercando di ottenere.

3

Non è possibile ottenere alcun dettaglio. L'intero punto di catch(...) è di avere tale "Non so cosa può accadere, quindi prendere qualsiasi cosa viene lanciata". Di solito, inserisci catch(...) dopo lo catch per i tipi di eccezione noti.

8

Un colto eccezione è accessibile dalla funzione std :: current_exception(), che è definito nella <eccezione>. Questo è stato introdotto in C++ 11.

std::exception_ptr current_exception(); 

Tuttavia, std :: exception_ptr è un tipo di implementazione definito, quindi non è possibile raggiungere i dettagli in ogni caso. typeid(current_exception()).name() ti dice exception_ptr, non l'eccezione contenuta. Quindi, l'unica cosa che puoi fare è std :: rethrow_exception(). (Queste funzioni sembrano essere lì per standardizzare catch-pass-and-rethrow attraverso i thread.)