Как уже говорилось, это возможно, но вы должны увидеть «осень-через '-схема в этом. Если в первом блоке try-catch блокируется ваше исключение, он не будет попадать во внешний блокирующий блок. Однако, если он не попадает во внутренний блокирующий блок, он попытается найти соответствующий обработчик исключений во внешнем блоке catch.
Вы также можете явно добавить исключение к следующему обработчику исключений, используя throw;
в своем внутреннем обработчике исключений.
Например, этот код:
try
{
try
{
throw std::runtime_error("Test");
}
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;
}
будет приводить:
Inner Exception-Handler: Test
Outer Exception-Handler: Test
Это работает, потому что std::runtime_error is derived from std::exception. Вы также должны заметить, что в таком тривиальном примере также можно просто написать блоки catch после друг друга, но если вы хотите выполнить другой код после первого блока catch, вам придется их вложить.
Вы просто должны любить этих людей, которые думают, что они умнее всех, и считают, что они владеют этим сайтом. –
Я обычно даю этим типам вопросы преимущества сомнений: только потому, что он работает на вашем компиляторе, это не значит, что это часть стандарта. Обратное также верно. – rmeador
@shoosh этот вопрос спас меня хотя бы на 90 секунд от его поиска! –