gpt4 book ai didi

c# - 使用 block 吞噬异常

转载 作者:太空狗 更新时间:2023-10-29 21:36:07 25 4
gpt4 key购买 nike

我有

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

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

void foo3()
{
using(...){...}
}

我有

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

我刚刚读到 using阻止吞咽异常。它有一种优雅的方式来处理 foo()foo2()foo3() 中的异常 foo()。我希望在方法中的每个using block 中有一个try/catch。我确实偶然发现了 this post建议使用扩展方法的地方,但我只是检查是否有更好的方法。

仅供引用,网络断开导致 using block 内的逻辑抛出异常,这就是我试图在一个常见位置处理的问题。

谢谢,

最佳答案

我想我理解其中的困惑。这里有一些伪代码(它可能真的会执行?)更简单地解释你的场景:

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

可以认为这段代码与这段代码相同:

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

通过使用 using block ,您实际上是在说,“无论您做什么,在继续之前对该对象执行 Dispose()”。但是,using block 无法妥善处理 Dispose() 失败的情况。正因为如此,它永远不会抛出内部异常,因为有另一个异常抢先了它,即使它是在之后发生的。

这有意义吗?我什至回答了你的问题吗?我不确定您是在寻求帮助以了解这一点还是什么。

关于c# - 使用 block 吞噬异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6457963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com