На самом деле, есть даже интересная техника для использования вложенных блоков try / catch: предположим, у вас есть несколько функций, которые фактически нуждаются в одинаковой обработке исключений.Особенно при переносе другого интерфейса это распространенный сценарий.В этом случае можно перехватывать все исключения, вызывать функцию из обработчика исключений и в этой функции перебрасывать исключение для реализации фактической обработки исключений:
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(); } }
Мне просто нравится избегать дублирования [нетривиальный] код!