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

推荐答案

您可以使用它来确保在try个内容之后或对异常执行某些操作,但是当您不希望使用该异常时.

需要明确的是,这并不隐藏例外情况.在异常向上传播到调用堆栈之前运行finally块.

当使用using关键字时,您也会无意中使用它,因为这会编译成try-finally(不是精确的转换,但为了参数起见,它已经足够接近了).

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

finally中运行的代码不一定能运行,但是在没有保证的情况下,它是相当边缘的——我甚至记不起来了.我所记得的是,如果你是这样的话,很有可能不跑finally米并不是你最大的问题:-)所以基本上不用担心.

如果进程被终止,Update from Tobias: finally将不会运行.

Update from 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.
}

编译成something个,比如:

SqlConnection conn;

try
{
    conn = new SqlConnection("");
    // Do stuff.
}
finally
{
    if (conn != null)
        conn.Dispose();
}

.net相关问答推荐

C#/.NET + VisualStudio,命名空间问题

问:在 Blazor WASM 应用程序中存储 api 密钥的最佳方式是什么?

docs.microsoft.com 上的 .NET 平台扩展是什么?

C#6.0 字符串插值本地化

.NET Core 是否支持异步控制台应用程序?

dotnet 恢复警告 NU1701

无法加载文件或程序集'System.ComponentModel.Annotations,版本 = 4.1.0.0

检测到包降级警告(dotnet core,vs 2017)

如何在 C# 7 中返回多个值?

我什么时候需要 .NET 中的 SecureString?

无法在 Windows 10 上安装 Windows SDK 7.1

nameof 的目的是什么?

为什么我不能在 lambda 表达式中使用空传播运算符?

Web API 2:如何在对象及其子对象上返回带有驼峰式属性名称的 JSON

String.Equals(a,b) 如何不产生 StackOverflowException?

为什么这个字符串的长度比它的字符数长?

如何找到特定 dll 的 PublicKeyToken?

Microsoft.Bcl.Build NuGet 包有什么作用?

使用 Json.NET 将任何类型的对象转换为 JObject

如何明智地使用 StringBuilder?