Рассмотрим следующий код:
try
{
throw _1();
}
catch (...)
{
try
{
throw _2();
}
catch (...)
{
throw _3();
}
throw;
}
Я хочу понять следующее:
1) Что именно происходит, когда случается throw _2;
? Активное исключение (_1
) заменяется другим (_2
)?
2) Какое именно исключение будет проброшено дальше при вызове throw;
?
3) Если throw _3;
не будет, то будет ли что-нибудь проброшено дальше?
Здесь нет никакой необходимости "заменять" активное исключение. Механизмы обработки исключений прекрасно "вкладываются" друг в друга. throw _2();
выбрасывает свое, независимое исключение. Если бы это исключение не ловилось сразу внутри первого обработчика, а вылетало бы за его пределы, то исключение _1
бы деструктировалось при выходе из обработчика, ибо его обработка завершена. А исключение _2
летело бы дальше.
В вашем же варианте после throw _3();
, исключение _2
ловится вторым обработчиком и деструктируется при выходе из этого второго обработчика, а исключение _1
деструктируется при выходе из первого обработчика - их обработка завершена. А исключение _3
летит дальше.
Если же вы в своем коде уберете throw _3();
, то после завершения обработки _2
через посредство throw;
будет перевыброшено _1
.
В текущем состоянии кода из-за throw _3();
управление никогда не дойдет до throw;
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Подскажите как скомпилировать файлИспользую g++ пытаюсь скомпилить
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском