c# - 为什么使用 block 会吞下异常?

标签 c# .net using-statement

最近在using语句中遇到异常处理的问题。问题是在“使用 block ”中抛出的异常可能会被吞噬,例如查看代码:

class DisposableObject : IDisposable
{
    public void Dispose()
    {
        throw new Exception("dispose");
    }
}

class Program
{
    static void Main()
    {
        try
        {
            using (var obj = new DisposableObject())
            {
                throw new Exception("using");
            }
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

在此示例中,您将在输出中看到“dispose”,第一个异常将被忽略,您永远不会知道它。经过一番搜索,我找到了文章 https://msdn.microsoft.com/en-us/library/aa355056(v=vs.110).aspx关于使用 block 的常见错误。但我的问题不是关于如何避免异常吞噬,我想知道为什么 MS 决定使用 block 来解包

try
{
...
}
finally
{
}

而不是其他方式,例如他们可以使用这样的方式解包:

//this code prevents exception swallowing
try
{                       
    ...
}
catch (Exception ex)
{
    try
    {
        if (obj != null)
            obj.Dispose();
    }
    catch (Exception disposeEx)
    {
        throw new AggregateException(ex, disposeEx);
    }

    throw;
}
if(obj != null)
    obj.Dispose();

最佳答案

因为 AggregateException 在创建 using() block 时不存在。

也因为 Dispose() 真的不应该抛出。

最后,因为您的示例和 finally block 之间在异常过滤器、堆栈展开和关键区域方面存在细微的语义差异。

关于c# - 为什么使用 block 会吞下异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31014009/

相关文章:

namespaces - 在命名空间声明后立即添加 "using namespace"是否可以接受?

c# - 在不指定类型参数的情况下对泛型类的成员使用 nameof

c# - Entity Framework 中具有默认值的 Nullable<int> 上的 OrderBy

c# - 使用语句的格式/缩进 (C#)

.net - .NET Framework可以在Win98上使用吗?

javascript - 使用 SHA256 和 .NET/Node.js 对密码进行哈希处理

c# - IDisposable.Dispose 永远不会在使用 block 异常后被调用

c# - C# 中的隐式变量赋值示例

c# - 如何更改中的回退字符

c# - 需要创建存储过程但有问题