Почему, наконец, блок существует?

В большинстве языков программирования есть блок 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)

Другие вопросы по тегам