По порядку Middle Исключения и ошибки обновлено

Порядок выполнения try/catch/finally

Вопрос

Функция f() бросает RuntimeException внутри try с блоками catch (LogicException) и finally. Вызывающий код оборачивает f() в try/catch (RuntimeException). Расставьте события по порядку.

Попробуйте сами

Расставьте шаги по порядку стрелками.

  1. 1
    Выполнение finally в f()
  2. 2
    Выполнение catch (RuntimeException) у вызывающего
  3. 3
    Продолжение кода после блока try/catch вызывающего
  4. 4
    Проверка catch (LogicException) в f(): не подходит
  5. 5
    Бросок RuntimeException внутри f()
Показать ответ и разбор

Коротко

RuntimeException не наследует LogicException, поэтому внутренний catch пропускается. Перед выходом из f() выполняется её finally, затем исключение ловит внешний блок, после чего выполнение продолжается за ним.

Правильный порядок

  1. 1
    Бросок RuntimeException внутри f()
  2. 2
    Проверка catch (LogicException) в f(): не подходит
  3. 3
    Выполнение finally в f()
  4. 4
    Выполнение catch (RuntimeException) у вызывающего
  5. 5
    Продолжение кода после блока try/catch вызывающего

Разбор

RuntimeException не наследует LogicException, поэтому внутренний catch пропускается. Перед выходом из f() выполняется её finally, затем исключение ловит внешний блок, после чего выполнение продолжается за ним.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.