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

Попробуйте поймать окончательный вопрос

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

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

4b9b3361

Ответ 1

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

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

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

catch(Exception ex)
{
   throw ex;
}

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

Ответ 2

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

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

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

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

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

Ответ 3

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

В качестве примера см. эту статью на c-sharpcorner.com.

Обновление:. Верно, если вы подключаете кабель, расплавляете процессор или размалываете материнскую плату, даже самый последний "наконец" не будет выполнен.

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

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

Ответ 4

Блок 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
}

Ответ 5

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