Какой смысл в блоке finally? - PullRequest
       112

Какой смысл в блоке finally?

28 голосов
/ 09 сентября 2008

Синтаксис в стороне, в чем разница между

try {
}
catch() {
}
finally {
    x = 3;
}

и

try {
}
catch() {
}

x = 3;

редактировать: в .NET 2.0?


так

try {
    throw something maybe
    x = 3
}
catch (...) {
    x = 3
}

поведенчески эквивалентен?

Ответы [ 15 ]

0 голосов
/ 09 сентября 2008

Любой код в finally выполняется в четном случае в случае необработанного исключения. Обычно код finally используется для очистки локальных объявлений неуправляемого кода с использованием .dispose ().

0 голосов
/ 09 сентября 2008

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

Представьте, что у вас есть обработчик файлов, в этом разница в том, как он будет написан.

try
{
   StreamReader stream = new StreamReader("foo.bar");
   stream.write("foo");
}
catch(Exception e) { } // ignore for now
finally
{
   stream.close();
}

по сравнению с

StreamReader stream = null;
try
{
    stream = new StreamReader("foo.bar");
    stream.write("foo");
} catch(Exception e) {} // ignore

if (stream != null)
    stream.close();

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

0 голосов
/ 09 сентября 2008

@ Ed , вы можете подумать о чем-то вроде catch(...), который перехватывает неопределенное исключение в C ++.

Но finally - это код, который будет выполняться независимо от того, что происходит в блоках catch.

У Microsoft есть страница справки по try-finally для C #

0 голосов
/ 09 сентября 2008

Блок finally должен выполняться независимо от того, поймали ли вы исключение или нет. См. Try / Catch / Наконец пример

0 голосов
/ 09 сентября 2008

Таким образом, вы можете очистить все открытые соединения и т. Д., Инициализированные в блоке try. Если вы открыли соединение, а затем произошло исключение, это исключение не будет закрыто должным образом. Этот тип сценария предназначен для блока finally.

...