По порядку Middle Исключения и ошибки обновлено
Порядок выполнения try/catch/finally
Вопрос
Функция f() бросает RuntimeException внутри try с блоками catch (LogicException) и finally. Вызывающий код оборачивает f() в try/catch (RuntimeException). Расставьте события по порядку.
Попробуйте сами
Расставьте шаги по порядку стрелками.
- 1Выполнение
finallyвf() - 2Выполнение
catch (RuntimeException)у вызывающего - 3Продолжение кода после блока
try/catchвызывающего - 4Проверка
catch (LogicException)вf(): не подходит - 5Бросок
RuntimeExceptionвнутриf()
Показать ответ и разбор
Коротко
RuntimeException не наследует LogicException, поэтому внутренний catch пропускается. Перед выходом из f() выполняется её finally, затем исключение ловит внешний блок, после чего выполнение продолжается за ним.
Правильный порядок
- 1Бросок
RuntimeExceptionвнутриf() - 2Проверка
catch (LogicException)вf(): не подходит - 3Выполнение
finallyвf() - 4Выполнение
catch (RuntimeException)у вызывающего - 5Продолжение кода после блока
try/catchвызывающего
Разбор
RuntimeException не наследует LogicException, поэтому внутренний catch пропускается. Перед выходом из f() выполняется её finally, затем исключение ловит внешний блок, после чего выполнение продолжается за ним.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.