В чем суть окончательного решения try catch/except finally
Я много лет использовал варианты try-catch/except-finally на многих языках, сегодня кто-то спросил меня, в чем смысл окончательно, и я не мог ответить.
В основном, почему вы положили оператор в итоге вместо того, чтобы просто положить его после всего блока try-catch? Или, другими словами, существует разница между следующими блоками кода:
try{ //a}
catch {//b}
finally {//c}
try{//a}
catch{//b}
//c
EDIT:
ЛЮДИ, я знаю, что в конечном итоге делает, я использую его целую вечность, но мой вопрос находится в приведенном выше примере, ставя //c
, в конце концов, кажется излишним, не так ли?
Ответы
Ответ 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. Поэтому, например, если вы открыли поток раньше, вам может понадобиться закрыть этот поток, иначе будет выбрано исключение. Наконец, блок полезен для такой проблемы.