Ответ 1
Нет, нет недостатков. То, как вы должны это делать.
Код, который я хочу выполнить в моем обработчике исключений, может сам вызвать исключение.
Является ли следующая структура законченной С++? Если да, есть ли недостатки?
try
{
// ...
}
catch (const E&)
{
try
{
// ...
}
catch (const F&)
{
}
}
Нет, нет недостатков. То, как вы должны это делать.
На самом деле существует даже интересная техника для использования вложенных 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(); } }
Мне просто нравится избегать дублирования [нетривиального] кода!
Это совершенно правильный способ кодирования.
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
try //outer try{}
{
try //inner try{}
{
throw std::runtime_error("Demo");
}
catch (std::runtime_error& e)
{
std::cerr << "Inner Exception-Handler: " << e.what() << std::endl;
throw;
}
}
catch (std::exception& e)
{
std::cerr << "Outer Exception-Handler: " << e.what() << std::endl;
}
return 0;
}