В Выгоде Попытки Наконец блок, делает наконец, блок всегда выполняет то независимо от того, что, или только если блок выгоды не возвращает ошибку?
У меня создалось впечатление, что наконец блок только выполняется, если блок выгоды передает без ошибок. Если блок выгоды выполняется из-за ошибки, разве он не должен останавливать выполнение все вместе и возвращать сообщение об ошибке если таковые имеются?
Не только блок finally будет выполняться после блока catch, try даже не требует, чтобы какое-либо исключение было перехвачено для выполнения finally. Следующий код является совершенно допустимым:
try
{
//do stuff
}
finally
{
//clean up
}
Я фактически удалил блоки catch из некоторого кода, который я унаследовал, когда блок catch состоял из:
catch(Exception ex)
{
throw ex;
}
В этом случае все, что требовалось, это очистить, поэтому я оставил его с просто попробуйте {} и, наконец, {} заблокируйте, и пусть исключения всплывают с неповрежденной трассировкой стека.
Блок finally (почти) всегда выполняется, независимо от того, было исключение или нет.
Я говорю почти, потому что есть несколько случаев, когда вызов finally не гарантируется:
Более того, даже если вводится блок finally, если ThreadAbortException
возникает, как только поток входит в блок finally, код в блоке finally не будет запущен.
Могут быть и другие случаи ...
блок finally выполняется в почти каждом случае. Поэтому он и называется 'finally'.
Пример см. в этой статье на c-sharpcorner.com.
Обновление: Правда, если вы перегрызете кабель, расплавите процессор или размолотите материнскую плату, даже самое последнее "наконец-то" не будет выполнено.
Но почти в каждом "нормальном" сценарии, т.е. независимо от того, выбрасывает ли ваш код исключение или нет, блок finally будет выполнен. Насколько мне известно, единственным "реальным" исключением из этого правила является исключение stackoverflow, которое завершит программу без перехода в finally.
Обновление 2: Этот вопрос был задан специально для C#. Этот ответ НЕ относится к Java, Python, Matlab или Scheme.
Блок 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
}
Код внутри блока finally всегда выполняется, независимо от того, возникло ли исключение. Кстати, я думаю, что на SO уже есть множество тем, которые занимаются этим вопросом.