Ну, во-первых, если часть «обработать исключение» сама выдает исключение, очистка не произойдет.
Что еще более важно, вы почти никогда не должны ловить все исключения. Вы должны поймать очень специфические исключения, которые вы можете обработать, и позволить другим исключениям всплыть. В этот момент вы должны использовать блок finally
, если хотите, чтобы очистка продолжалась.
Непонятно, какой язык вы используете, но если это Java, то уже есть разница, поскольку исключения, не являющиеся исключениями (другие подклассы Throwable), в конечном итоге будут очищены в вашей первой версии, но не во второй - но ты вообще не должен ловить Exception
.
Лично я обнаружил, что пишу больше блоков try / finally, чем блоков try / catch или try / catch / finally. Я нахожу довольно редким, что я могу действительно иметь дело с исключением ... хотя иногда я ловлю одно исключение, просто чтобы преобразовать его в другое, соответствующее уровню абстракции, над которым я работаю, и затем перебросить.
РЕДАКТИРОВАТЬ: Как отмечено в ответе dj aqeel, операторы finally
также выполняются, если блок завершает без исключения, например, через return
заявление. Тот факт, что я забыл, является хорошим поводом отдавать предпочтение finally
: оно способствует согласованности . Это единственное место, где можно выполнить очистку, независимо от выхода из блока.
Также обратите внимание, что в C # вы идиоматически используете оператор using
для одноразовых ресурсов. А в Java 7 есть оператор try-with-resources .