mio grande applicazione ha questa struttura:Come catturare le eccezioni in modo condizionale?
int main()
{
try {
...
} catch (std::exception& e) {
std::cout << "Fatal error: " << e.what() << (some more data) << std::endl;
return 1;
}
}
Nel profondo lo stack di chiamate, vari oggetti verificare il loro stato interno, gettando std::runtime_exception
se rilevano qualcosa di brutto. Il gestore eccezioni all-inclusive lo cattura, stampa alcune informazioni utili e termina il programma.
Tuttavia, quando eseguo il debug in MS Visual Studio, potrei trarre vantaggio dal non avere alcun gestore di eccezioni: Visual Studio ha il proprio, molto utile gestore, che interrompe la mia applicazione nel punto in cui viene lanciata l'eccezione, quindi Posso esaminare cosa è andato storto.
Come posso eseguire la cattura delle mie eccezioni in modo condizionale?
ho provato la seguente:
try {
...
} catch (std::exception& e) {
if (IsDebuggerPresent())
throw;
else
std::cout << "Fatal error: " << e.what() << (some more data) << std::endl;
}
Questo ha dato un risultato strano: Visual Studio catturato l'eccezione che è stato rilanciati e mi ha mostrato la traccia dello stack nel punto in cui è stata generata l'eccezione. Tuttavia, tutti gli oggetti nella mia applicazione sono stati apparentemente distrutti, e non ho potuto vedere ad es. variabili locali o membri.
ho potuto fare il gestore di eccezioni alla condizione che una bandiera compilazione:
#ifdef NDEBUG
try {
#endif
...
#ifdef NDEBUG
} catch (std::exception& e) {
std::cout << "Fatal error: " << e.what() << (some more data) << std::endl;
}
#endif
ma questo è scomodo perché devo ricompilare tutto se voglio eseguire il debug.
Quindi, come posso rendere condizionale la mia gestione delle eccezioni (a seconda di un argomento della riga di comando, ad esempio)?
Try 'debug' ->' Exceptions' e spuntare la casella "break on lancio" per l'eccezione (s) che si desidera catturare. – CompuChip
Un metodo migliore sarebbe quello di * condizionalmente * lanciare un'eccezione che i gestori non possono semplicemente intercettare (attraverso un livello di riferimento indiretto), lasciandola al debugger per strapparli. –
Se il metodo @ CompuChip funziona per te, è sicuramente il meglio di questi due. – TonyK