попробуй уловить наконец вопрос - PullRequest
17 голосов
/ 22 июля 2010

В блоке Try Catch finally всегда выполняется блок finally независимо от того, что или только в том случае, если блок catch не возвращает ошибку?

У меня сложилось впечатление, что блок finally выполняется только в том случае, если блок catch проходит без ошибок.Если блок catch выполняется из-за ошибки, не должен ли он остановить выполнение все вместе и вернуть сообщение об ошибке, если таковое имеется?

Ответы [ 5 ]

31 голосов
/ 22 июля 2010

Блок finally (почти) всегда выполняется, независимо от того, было ли исключение.

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

  • Если в вашем коде есть бесконечный цикл или тупик, так что выполнение остается внутри блоков try или catch, тогда блок finally никогда не будет выполнен.
  • Если ваше приложение внезапно завершается из-за остановки процесса.
  • Отключение питания.
  • Вызов Environment.FailFast .
  • Некоторые исключения, такие как:
  • Исключение, сгенерированное в финализаторе ( source ).

Более того, даже если блок finally вводится, если ThreadAbortException происходит так же, как поток входит в блок finally, код вблок finally не будет запущен.

Могут быть и другие случаи ...

12 голосов
/ 22 июля 2010

Мало того, что блок finally будет выполняться после блока catch, try даже не требует, чтобы какое-либо исключение было перехвачено для выполнения finally.Следующее является абсолютно допустимым кодом:

try 
{
//do stuff
}
finally 
{
   //clean up
}

Я фактически вынул блоки catch в некотором коде, который я унаследовал, когда блок catch состоял из:

catch(Exception ex)
{
   throw ex;
}

В этом случае все этопотребовалось очистить, поэтому я оставил его только с блоком try {} и finally {} и позволил исключениям всплыть с неповрежденной трассировкой стека.

5 голосов
/ 22 июля 2010

блок finally выполняется в почти в каждом случае.Вот почему он называется «наконец».

Например, см. эту статью на c-sharpcorner.com.

Обновление: Это правдаЕсли вы подключите кабель, расплавите процессор или отшлифуете материнскую плату, даже самый последний вариант «наконец» не будет выполнен.

Но почти в каждом «нормальном» сценарии, то есть, если ваш код вызывает исключение или нет, будет выполнен блок finally.Насколько мне известно, единственное «реальное» исключение из этого правила - это исключение stackoverflow , которое прекратит выполнение программы без окончательного ввода.

Обновление 2: Этот вопросспросили специально для C #.Этот ответ НЕ охватывает Java, Python, Matlab или Scheme.

1 голос
/ 22 июля 2010

Блок finally будет выполнен, но вам нужно быть осторожным с исключениями внутри блока finally.

try {
   // some disposable method "o"
} finally {
  o.Dispose(); // if o is null, exception is thrown
   // anything after this exception will fail to execute
}
0 голосов
/ 22 июля 2010

Код внутри блока finally выполняется всегда, даже если есть исключение. Кстати, я думаю, что на SO уже есть множество тем, которые занимаются этим вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...