Использование блока finally против написания кода после блока try / catch - PullRequest
6 голосов
/ 15 сентября 2011

Как я понимаю, следующие 2 примера должны делать то же самое. Почему 1-й считается лучшим?

1

try {
  riskyMethod();
}
catch(Exception e) {
  //handle exception
}
finally {
  cleanUp();
}

2

try {
  riskyMethod();
}
catch(Exception e) {
  //handle exception
}
cleanUp();

РЕДАКТИРОВАТЬ: пример на Java, но я задаюсь вопросом о концепции блока finally в целом, который используется в любом языке

Ответы [ 3 ]

12 голосов
/ 15 сентября 2011

Ну, во-первых, если часть «обработать исключение» сама выдает исключение, очистка не произойдет.

Что еще более важно, вы почти никогда не должны ловить все исключения. Вы должны поймать очень специфические исключения, которые вы можете обработать, и позволить другим исключениям всплыть. В этот момент вы должны использовать блок finally, если хотите, чтобы очистка продолжалась.

Непонятно, какой язык вы используете, но если это Java, то уже есть разница, поскольку исключения, не являющиеся исключениями (другие подклассы Throwable), в конечном итоге будут очищены в вашей первой версии, но не во второй - но ты вообще не должен ловить Exception.

Лично я обнаружил, что пишу больше блоков try / finally, чем блоков try / catch или try / catch / finally. Я нахожу довольно редким, что я могу действительно иметь дело с исключением ... хотя иногда я ловлю одно исключение, просто чтобы преобразовать его в другое, соответствующее уровню абстракции, над которым я работаю, и затем перебросить.

РЕДАКТИРОВАТЬ: Как отмечено в ответе dj aqeel, операторы finally также выполняются, если блок завершает без исключения, например, через return заявление. Тот факт, что я забыл, является хорошим поводом отдавать предпочтение finally: оно способствует согласованности . Это единственное место, где можно выполнить очистку, независимо от выхода из блока.

Также обратите внимание, что в C # вы идиоматически используете оператор using для одноразовых ресурсов. А в Java 7 есть оператор try-with-resources .

9 голосов
/ 15 сентября 2011

Поскольку код в блоке finally всегда выполняется, даже если у вас есть операторы return, исключения или другие управляющие операторы, оставляющие операторы в блоках try или catch ... finally всегда будет выполняться в любом случае, кроме выключения компьютера непосредственно переднаконец заблокировать.:)

0 голосов
/ 15 сентября 2011

Потому что "наконец-то" - это четкое указание на то, что вы здесь делаете уборку.

...