使用块吞咽异常

6 c# exception-handling using-statement

我有

void foo1()
{
   using(...){...}
}

void foo2()
{
   using(...){...}
}

void foo3()
{
   using(...){...}
}
Run Code Online (Sandbox Code Playgroud)

我有

void foo()
{
    ...
    backgroundWorker.DoWork += (s, ev) =>
                                           {
                                               try
                                               {
                                                   foo1();
                                                   foo2();
                                                   foo3();
                                               }
                                               catch (Exception ex)
                                               {
                                                   // log ex
                                               }
                                           };
      ...    
}
Run Code Online (Sandbox Code Playgroud)

我只是读到了using块吞下异常.它有一种优雅的方式来处理从异常foo1(),foo2()foo3()foo().我不想using在方法中的每个块内部使用try/catch .我确实偶然发现了这篇文章,建议使用扩展方法,但我只是检查是否有更好的方法.

仅供参考,网络断开导致using块内的逻辑抛出异常,这就是我在一个常见的地方尝试处理的问题.

谢谢,

Jax*_*ian 4

我想我理解这种困惑。这是一些伪代码(它可能实际上执行?)更简单地解释您的场景:

public class Foo
{
    public void DoStuff()
    {
        using (var x = new Thing())
        {
            throw new ApplicationException("This code breaks");
        }
    }

    private class Thing : IDisposable
    {
        public override Dispose()
        {
            throw new ApplicationException("Help, I can't dispose!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码可以被认为与下面的代码相同:

public class Foo
{
    public void DoStuff()
    {
        var x = new Thing();
        try
        {
            throw new ApplicationException("This code breaks");
            x.Dispose();
        }
        catch (Exception err)
        {
            x.Dispose();
            rethrow;
        }
    }

    private class Thing : IDisposable
    {
        public override Dispose()
        {
            throw new ApplicationException("Help, I can't dispose!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

通过使用using块,您实质上是在说:“无论您做什么,Dispose()请先在该对象上执行,然后再继续。” 然而,using当失败时,该块不会优雅地处理这种情况Dispose()。因此,它永远不会抛出内部异常,因为有另一个异常抢占了它,即使它是在之后发生的。

这有道理吗?我什至回答了你的问题吗?我不确定您是否正在寻求帮助来理解这一点或什么。

  • using 块是否有问题?我以为这只是一次尝试/最终。 (2认同)