In realtà, c'è anche una tecnica interessante per l'utilizzo di try/catch-blocchi annidati: si supponga di avere molteplici funzioni che devono effettivamente la stessa gestione delle eccezioni. Soprattutto quando si esegue il wrapping di un'altra interfaccia, questo è uno scenario comune. In questo caso è possibile raggiungere tutte le eccezioni, chiamare una funzione dal gestore di eccezioni, e in questa funzione rigenerare l'eccezione per implementare la gestione delle eccezioni attuale:
void fancy_handler() {
try {
throw; // assumes that fancy_handler() is called from catch-clause
} catch (std::runtime_error const& rt) {
std::cout << "runtime-error: " << ex.what() << "\n";
} catch (std::exception const& ex) {
std::cout << "excption: " << ex.what() << "\n";
} catch (...) {
std::cout << "unknown exception\n";
}
}
void foo() { try { do_foo(); } catch (...) { fancy_handler(); } }
void bar() { try { do_bar(); } catch (...) { fancy_handler(); } }
Adoro evitando duplicare [non banale] codice!
fonte
2012-01-03 20:47:57
Sì, è perfettamente valido. – Anand