C++ и многоуровневые вложенные try-catch

75
06 января 2022, 01:40

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

try
{
    throw _1();
}
catch (...)
{
    try
    {
        throw _2();
    }
    catch (...)
    {
        throw _3();
    }
    throw;
}

Я хочу понять следующее:

1) Что именно происходит, когда случается throw _2;? Активное исключение (_1) заменяется другим (_2)?

2) Какое именно исключение будет проброшено дальше при вызове throw;?

3) Если throw _3; не будет, то будет ли что-нибудь проброшено дальше?

Answer 1

Здесь нет никакой необходимости "заменять" активное исключение. Механизмы обработки исключений прекрасно "вкладываются" друг в друга. throw _2(); выбрасывает свое, независимое исключение. Если бы это исключение не ловилось сразу внутри первого обработчика, а вылетало бы за его пределы, то исключение _1 бы деструктировалось при выходе из обработчика, ибо его обработка завершена. А исключение _2 летело бы дальше.

В вашем же варианте после throw _3();, исключение _2 ловится вторым обработчиком и деструктируется при выходе из этого второго обработчика, а исключение _1 деструктируется при выходе из первого обработчика - их обработка завершена. А исключение _3 летит дальше.

Если же вы в своем коде уберете throw _3();, то после завершения обработки _2 через посредство throw; будет перевыброшено _1.

В текущем состоянии кода из-за throw _3(); управление никогда не дойдет до throw;

READ ALSO
Как скомпилировать c++ файл?(ubuntu)

Как скомпилировать c++ файл?(ubuntu)

Подскажите как скомпилировать файлИспользую g++ пытаюсь скомпилить

102
Конструктор класса. Не пойму. C++

Конструктор класса. Не пойму. C++

Доброго времени суток!

95
Не получается сделать задание по массивам [закрыт]

Не получается сделать задание по массивам [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

195
Быстродействие объединения строк

Быстродействие объединения строк

Какой способ объединения строк следует когда использовать

95