Какой смысл ваще в попытке поймать/наконец, за исключением заявления


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

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

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


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

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

3   51   2012-03-13 20:16:34

3 ответа:

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

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

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

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

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

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

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

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