Будут ли исключения, сгенерированные в блоке catch, перехватить более поздние блоки catch? - PullRequest
23 голосов
/ 06 августа 2011

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

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

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

Ответы [ 3 ]

24 голосов
/ 06 августа 2011

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

9 голосов
/ 06 августа 2011

Нет, не будет, включающий блок захвата вверх по иерархии сможет его перехватить.

Пример примера:

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;
}
2 голосов
/ 06 августа 2011

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

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

...