Ответ 1
Нет. Только исключения, созданные в связанном блоке try
, могут быть захвачены блоком catch
.
Рассмотрим следующий код С++:
try {
throw foo(1);
} catch (foo &err) {
throw bar(2);
} catch (bar &err) {
// Will throw of bar(2) be caught here?
}
Я бы ожидал, что ответ будет отсутствовать, так как он не находится внутри блока try
, и я вижу в другом вопросе ответ для Java нет ответа, но вы хотите подтвердить, что С++ тоже нет. Да, я могу запустить тестовую программу, но мне хотелось бы знать определение языка поведения в удаленном случае, когда у моего компилятора есть ошибка.
Нет. Только исключения, созданные в связанном блоке try
, могут быть захвачены блоком catch
.
Нет. Это не будет. Закрывающий блок catch вверх, иерархия сможет его поймать.
Пример примера:
void doSomething()
{
try
{
throw foo(1);
}
catch (foo &err)
{
throw bar(2);
}
catch (bar &err)
{
// Will throw of bar(2) be caught here?
// NO It cannot & wont
}
}
int main()
{
try
{
doSomething();
}
catch(...)
{
//Catches the throw from catch handler in doSomething()
}
return 0;
}
Нет, блок catch обрабатывает ближайшее исключение, поэтому, если вы попытаетесь... catch (Exception & exc)... catch (SomethingDerived & outputExc), исключение будет обрабатываться в блоке & exc
Вы можете добиться желаемого поведения путем делегирования исключений вызывающему методу