Почему, наконец, блок существует?
В большинстве языков программирования есть блок finally, который может быть помещен после блока try или catch следующим образом:
try {
sensitiveFunction();
} catch (Exception e) {
executedWhenFailed();
} finally {
alwaysExecuted();
}
Но мы можем выполнить тот же код без, наконец, такого блока:
try {
sensitiveFunction();
} catch (Exception e) {
executedWhenFailed();
}
alwaysExecuted();
Итак, почему наконец существует блок? У кого-нибудь есть пример, что, наконец, блок требуется?
Спасибо
4 ответа
Даже эти примеры не эквивалентны: если sensitiveFunction()
бросает что-то, что не распространяется Exception
но Error
вместо этого alwaysExecuted
не будет казнен без finally
(пожалуйста, не пытайтесь "исправить" это, ловя Throwable
).
Или сказать executedWhenFailed()
сам вызывает исключение: довольно часто отбрасывать исключение из catch
блок после добавления некоторой информации. Снова, alwaysExecuted()
не будет выполнен во втором фрагменте.
Или предположим, что у вас есть return sensitiveFunction();
вместо просто звонка. И т. Д.
finally
существует, так что код всегда можно запустить, независимо от того, поймали ли вы исключение или нет.
Иногда вы хотите просто использовать try
а также finally
все вместе:
allocate()
try:
do_something_with_allocated()
finally:
deallocate()
В приведенном выше примере это позволяет на 100% уверенно очистить ресурс, который был открыт выше, без учета каких-либо исключений, которые могут распространяться вверх.
Если вы бросите новое исключение в свой блок catch, вы в конечном итоге (после того, как это исключение будет обработано) окажетесь в вашем блоке finally. Но не в очереди после вашего улова.
Просто бросьте исключение в executedWhenFailed
в вашем первом примере alwaysExecuted
будет выполнен, во втором это не будет.
В
finally
блок выполняется, даже если есть
return
заявление в
catch()
блокировать.
(Пример в JavaScript)