Ole*_*leg 5 .net c# 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,您将在输出中看到 'dispose',第一个异常将被忽略,您将永远不会知道它。经过一番搜索,我找到了关于使用块的常见错误的文章https://msdn.microsoft.com/en-us/library/aa355056(v=vs.110).aspx。但我的问题不是关于如何避免异常吞咽,我想知道为什么 MS 决定使用 block 来解包
try
{
...
}
finally
{
}
Run Code Online (Sandbox Code Playgroud)
而不是其他的,例如他们可以解开使用这样的东西:
//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();
Run Code Online (Sandbox Code Playgroud)
    因为在创建块AggregateException时不存在。using()
也因为Dispose()确实不应该扔。
finally最后,因为您的示例和块之间在异常过滤器、堆栈展开和关键区域方面存在细微的语义差异。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           755 次  |  
        
|   最近记录:  |