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块内的逻辑抛出异常,这就是我在一个常见的地方尝试处理的问题.
谢谢,
我想我理解这种困惑。这是一些伪代码(它可能实际上执行?)更简单地解释您的场景:
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()。因此,它永远不会抛出内部异常,因为有另一个异常抢占了它,即使它是在之后发生的。
这有道理吗?我什至回答了你的问题吗?我不确定您是否正在寻求帮助来理解这一点或什么。