попробуйте выгоду наконец вопрос

В Выгоде Попытки Наконец блок, делает наконец, блок всегда выполняет то независимо от того, что, или только если блок выгоды не возвращает ошибку?

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

17
задан John Saunders 21 July 2010 в 22:18
поделиться

5 ответов

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

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

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

catch(Exception ex)
{
   throw ex;
}

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

12
ответ дан 30 November 2019 в 10:45
поделиться

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

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

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

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

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

31
ответ дан 30 November 2019 в 10:45
поделиться

блок finally выполняется в почти каждом случае. Поэтому он и называется 'finally'.

Пример см. в этой статье на c-sharpcorner.com.

Обновление: Правда, если вы перегрызете кабель, расплавите процессор или размолотите материнскую плату, даже самое последнее "наконец-то" не будет выполнено.

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

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

5
ответ дан 30 November 2019 в 10:45
поделиться

Блок 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
}
1
ответ дан 30 November 2019 в 10:45
поделиться

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

0
ответ дан 30 November 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: