Подтвердить что ты не робот

Будет ли исключение, заброшенное в catch catch, поймать последующие блоки catch?

Рассмотрим следующий код С++:

try {
  throw foo(1);
} catch (foo &err) {
  throw bar(2);
} catch (bar &err) {
  // Will throw of bar(2) be caught here?
}

Я бы ожидал, что ответ будет отсутствовать, так как он не находится внутри блока try, и я вижу в другом вопросе ответ для Java нет ответа, но вы хотите подтвердить, что С++ тоже нет. Да, я могу запустить тестовую программу, но мне хотелось бы знать определение языка поведения в удаленном случае, когда у моего компилятора есть ошибка.

4b9b3361

Ответ 1

Нет. Только исключения, созданные в связанном блоке try, могут быть захвачены блоком catch.

Ответ 2

Нет. Это не будет. Закрывающий блок 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;
}

Ответ 3

Нет, блок catch обрабатывает ближайшее исключение, поэтому, если вы попытаетесь... catch (Exception & exc)... catch (SomethingDerived & outputExc), исключение будет обрабатываться в блоке & exc

Вы можете добиться желаемого поведения путем делегирования исключений вызывающему методу