Внешний catch перехватит Ex3: исключение из finally заменит распространяющееся Ex2. Ex1 до этого было перехвачено внутренним catch.
Какой тип исключения будет проброшен из вложенной конструкции try‑catch‑finally
Внешний catch перехватит Ex3: исключение из finally заменит распространяющееся Ex2. Ex1 до этого было перехвачено внутренним catch.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Рассмотрим типичную комбинацию блоков try, catch и finally. Нужно понять, какое исключение в итоге окажется наружу.
try
{
try
{
throw Ex1;
}
catch
{
throw Ex2;
}
finally
{
throw Ex3;
}
}catch
{
// ?
}
Ответ
Внешний catch перехватит Ex3: исключение из finally заменит распространяющееся Ex2. Ex1 до этого было перехвачено внутренним catch.
Предполагается, что Ex1, Ex2 и Ex3 — существующие ненулевые экземпляры Exception. Сначала бросается Ex1, внутренний catch начинает выбрасывать Ex2, но при выходе обязательно исполняется finally. Его throw Ex3 становится текущим исключением.
Автоматической цепочки InnerException из этих трёх объектов не образуется. Во внешнем catch (Exception ex) переменная ex будет ссылаться на Ex3. Пустой внешний catch поглотит его, поэтому после всей конструкции наружу уже ничего не уйдёт. Именно поэтому исключения при очистке ресурсов нельзя бездумно подменять новыми.