为什么使用块吞下异常?

时间:2015-06-23 21:38:36

标签: c# .net using-statement

我最近在using语句中遇到了异常处理的问题。问题在于使用块'内部引发的异常。可以吞下去,比如看代码:

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);
        }
    }
}

在此示例中,您将看到“处置”'在输出中,第一个异常将被忽略,您将永远不会知道它。经过一番搜索,我发现文章https://msdn.microsoft.com/en-us/library/aa355056(v=vs.110).aspx关于使用块的常见错误。但我的问题并不是如何避免吞咽异常,我不知道如何避免异常吞咽。想知道为什么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();

1 个答案:

答案 0 :(得分:3)

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

另外因为Dispose()真的不应该扔掉。

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