C#: зачем беспокоиться о предложении "наконец"?
Возможный дубликат:
Зачем использовать наконец в C#?
В C# какой смысл иметь finally
статья?
например.
try {
// do something
}
catch (Exception exc)
{
// do something
}
// do something
Разве код в конце не будет выполнен в любом случае? Какой смысл finally
блок?
7 ответов
Наконец, для случая, когда даже перехват выдает исключение, плюс он позволяет вам выполнять код при удаче и неудаче, в конце концов будет выполняться ВСЕГДА. ВСЕГДА.
Хорошо, кроме случаев, когда приложение убито на системном уровне или компьютер взрывается.
Наконец, гарантирует, что все в блоке будет выполнено, независимо от того, активированы ли предыдущие два оператора.
Хорошим примером будет выпуск ресурсов базы данных.
Пример:
try
{
//Open a database connection
}
catch
{
//Catch exception, database connection failed
}
finally
{
//Release the opened database connection resources
}
Наконец, гарантирует, что все, что находится в нем, сработает, если попытка сработает или не удастся. В сценарии, где происходит улов, вам не гарантируется, что все в последний раз //do something
произойдет.
Код в блоке Наконец всегда выполняется независимо от того, было ли выброшено исключение или нет. Код, следующий за блоком исключения, может выполняться или не выполняться, если путь возвращается в перехвате.
finally
блок гарантированно выполняется при обнаружении исключения, даже если блок обработки исключений выдает больше исключений. Часто используется для очистки определенных видов ресурсов, таких как дескрипторы открытых файлов, сетевые подключения и т. Д.
Хорошие примеры здесь:
Потому что есть определенные объекты, над которыми вы должны выполнить очистку, иначе это вызовет проблемы для вашего приложения.
Постоянно используемый пример использует SqlConnection:
SqlConnection conn = new SqlConnection(connString);
try
{
conn.Open();
throw new ArgumentException();
}
catch(SqlException ex)
{
}
В этом случае SqlConnection остается открытым без возможности его закрытия, поскольку вы обрабатываете SqlException, но выдается ArgumentException. Если вы используете блок finally, этого не произойдет, потому что будет выполнен код блока finally:
try
{
conn.Open();
throw new ArgumentException();
}
catch(SqlException ex)
{
}
finally
{
conn.Dispose();
}
Есть части вашего кода, которые вы хотите выполнить независимо от успеха предыдущего кода. Используя Try/Catch/ Наконец, вы можете извлечь выгоду из обработки ошибок.