Какой тип исключения будет проброшен из вложенной конструкции try‑catch‑finally

Внешний catch перехватит Ex3: исключение из finally заменит распространяющееся Ex2. Ex1 до этого было перехвачено внутренним catch.

Короткий ответ

Что ответить на собеседовании

Внешний 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 поглотит его, поэтому после всей конструкции наружу уже ничего не уйдёт. Именно поэтому исключения при очистке ресурсов нельзя бездумно подменять новыми.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее