Вы могли бы использовать его, чтобы обеспечить выполнение некоторых действий после содержимого try
или исключения, но если вы не хотите использовать это исключение.
Просто чтобы прояснить, это не скрывает исключений. Блок finally
запускается до того, как исключение распространяется по стеку вызовов.
Вы также можете непреднамеренно использовать его при использовании ключевого слова using
, поскольку оно компилируется в try-finally
(не точное преобразование, но для аргумента оно достаточно близко).
try
{
TrySomeCodeThatMightException();
}
finally
{
CleanupEvenOnFailure();
}
Код, выполняемый в finally
, не гарантированно выполняется, однако случай, когда он не гарантирован, является довольно краевым - я даже не могу вспомнить это. Все, что я помню, это то, что если вы в этом случае, очень велики шансы, что не запускать finally
не является вашей самой большой проблемой :-), так что в основном не переживайте.
Обновление от Тобиаса: finally
не запустится, если процесс будет остановлен.
Обновление от Paddy: Условия, когда, наконец, не выполняется в .net try..finally block
Наиболее распространенный пример, который вы можете увидеть, это удаление соединения с базой данных или внешнего ресурса, даже если код завершится ошибкой:
using (var conn = new SqlConnection("")) // Ignore the fact we likely use ORM ;-)
{
// Do stuff.
}
Компилируется в что-то вроде:
SqlConnection conn;
try
{
conn = new SqlConnection("");
// Do stuff.
}
finally
{
if (conn != null)
conn.Dispose();
}