Какой смысл, наконец, в try catch / кроме оператора finally - PullRequest
61 голосов
/ 13 марта 2012

В течение многих лет я использовал варианты try-catch / исключением-finally во многих языках, сегодня кто-то спросил меня, в чем смысл, наконец, и я не смог ответить.

По сути, почему бы вам добавить оператор в конце вместо того, чтобы помещать его после всего блока try-catch? Или, другими словами, есть ли разница между следующими блоками кода:

try{ //a}
catch {//b}
finally {//c}


try{//a}
catch{//b}
//c

EDIT:
ЛЮДИ, я знаю, что, в конце концов, делает, я использую это целую вечность, но мой вопрос в приведенном выше примере: //c в конце концов кажется излишним, не так ли?

Ответы [ 3 ]

85 голосов
/ 13 марта 2012

Цель блока finally состоит в том, чтобы гарантировать, что код запускается в трех обстоятельствах, которые не очень аккуратно обрабатываются, используя только блоки "catch":

  1. Если код внутри блока `try` завершается через` return`
  2. Если код в блоке перехвата либо перебрасывает перехваченное исключение, либо - случайно или преднамеренно - в результате выдает новое.
  3. Если код в блоке `try` встречает исключение, для которого нет перехвата.

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

Кстати, я бы хотел, чтобы конструкторы языков включали аргумент exception для блока finally, чтобы иметь дело со случаем, когда нужно выполнить очистку после исключения, но все же хочет, чтобы он позволил выполнить вызов стек (например, можно заключить код для конструктора в такую ​​конструкцию и Dispose строящийся объект, если конструктор собирался выйти с исключением).

2 голосов
/ 13 марта 2012

Наконец, блок выполняется, даже если исключение выдается в блоке try. Поэтому, например, если вы открывали поток раньше, вы можете захотеть закрыть этот поток, либо сгенерировано исключение, либо нет. Наконец, блок полезен для такой проблемы.

0 голосов
/ 13 марта 2012

Finally убедитесь, что ваш код выполняется, даже если вы получили исключение.

Блок finally полезен для очистки любых ресурсов, выделенных в блоке try, а также для запуска любого кода, который должен выполняться, даже если есть исключение

http://msdn.microsoft.com/en-us/library/zwc8s4fz(v=vs.80).aspx

...