Подтвердить что ты не робот

В чем суть окончательного решения try catch/except finally

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

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

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


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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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