c# - 使用 'try-finally' block 而不使用 'catch' block

标签 c# .net exception exception-handling

在某些情况下是否适合使用 try-finally block 而不使用 catch block ?

最佳答案

您可以使用它来确保某些操作发生在 try 内容之后或发生异常时,但您不希望使用该异常。

需要说明的是,这并没有隐藏异常。 finally block 在异常传播到调用堆栈之前运行。

当你使用 using 关键字时,你也会无意中使用它,因为这会编译成一个 try-finally (不是一个精确的转换,但为了论证它是足够接近)。

try
{
    TrySomeCodeThatMightException();
}
finally
{
    CleanupEvenOnFailure();
}

finally 中运行的代码不能保证运行,但是不能保证它的情况相当边缘 - 我什至不记得了。我只记得,如果你是那种情况,那么不运行 finally 很可能不是你最大的问题:-) 所以基本上不要担心。

来自 Tobias 的更新:如果进程被终止,finally 将不会运行。

来自 Paddy 的更新: Conditions when finally does not execute in a .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();
}

关于c# - 使用 'try-finally' block 而不使用 'catch' block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9291437/

相关文章:

java - 配置IntelliJ Java异常断点

c# - 使用企业库异常 block 的 WCF 异常屏蔽

c# - EventHandle.WaitOne + WebBrowser = 等待 DocumentComplete 时死锁

c# - DataTable 列数据到组合框错误

c# - 通过查看每个对象自己的路径对多个对象集合进行排序

c# - C# 中的 Armadillo 功能

c# - 如何将C#代码转换为Kotlin的Json库

c# - 如何在 Silverlight 中聚焦图像?

c# - 多行正则表达式不匹配

php - 在每个 Controller 中处理相同的 try catch 结构