可能重复:
为什么在 C# 中使用 finally?
在 C# 中,有一个finally
子句有什么意义?
例如。
try {
// do something
}
catch (Exception exc)
{
// do something
}
// do something
最后的代码不会执行吗?finally
块的意义何在?
可能重复:
为什么在 C# 中使用 finally?
在 C# 中,有一个finally
子句有什么意义?
例如。
try {
// do something
}
catch (Exception exc)
{
// do something
}
// do something
最后的代码不会执行吗?finally
块的意义何在?
finally 是针对即使 catch 也抛出异常的事件,加上它允许您在成功和失败时执行代码,finally总是会被执行。总是。
好的,除非应用程序在系统级别被杀死或计算机爆炸。
finally 确保块中的任何内容都将被执行,无论前两个语句是否被激活。
一个很好的例子是释放数据库资源。
例子:
try
{
//Open a database connection
}
catch
{
//Catch exception, database connection failed
}
finally
{
//Release the opened database connection resources
}
无论先前的代码是否成功,您都希望执行一些代码。通过使用 Try/Catch/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();
}
当异常被捕获时,该finally
块被保证运行,即使异常处理块抛出更多异常。通常用于清理某些类型的资源,例如打开的文件句柄、网络连接等...
这里的好例子:
如果尝试成功或失败,Finally 确保其中的任何内容都会触发。在发生捕获的情况下,您不能保证最后一切//do something
都会发生。
无论是否抛出异常,Finally 块中的代码都会始终执行。如果路径在 catch 中返回,则异常块后面的代码可能会执行,也可能不会执行。