Рассмотрим следующий код:
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;
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости