如何在.NET 2.0的using块中捕获异常?

时间:2020-03-05 18:45:28  来源:igfitidea点击:

这些天,当我有一个实现IDisposable的对象时,我试图越来越多地利用using块,但是我没有弄清的一件事就是如何像在正常try / catch / finally中那样捕获异常。有任何代码示例可以向我指出正确的方向吗?

编辑:阅读完回复后,问题已被修改。那是"如何在.NET 2.0的using块中引发异常?"但是我实际上是在寻找一种在using块中捕获这些异常的方法。

我正在寻找有关在using块中滚动自己的catching块的更多详细信息。

编辑:我想避免的是必须在我的using块中使用try / catch / finally,如@Blair所示。但这可能不是问题...

编辑:@Blair,这正是我在寻找的东西,感谢详细答复!

解决方案

回答

是的,在使用块中引发异常没有什么不同。
请记住,using块基本上可以转换为:

IDisposable disposable = null;
try
{
    disposable = new WhateverYouWantedToMake();
}
finally
{
    disposable.Dispose()
}

因此,如果我们想抓捕任何东西,我们都必须自己动手抓捕,但抓捕/投掷是与使用完全不同的关注点。几乎可以保证执行finally(保存不可捕获的异常(例如stackoverflow或者内存不足)或者有人将电源从PC中拔出)。

回答

我真的不明白我们通常会抛出异常的问题。
如果MyThing实现了IDisposable,则:

using ( MyThing thing = new MyThing() )
{
    ...
    throw new ApplicationException("oops");
}

当我们离开该块时,会抛出Thing.Dispose,因为会引发异常。如果要将try / catch / finally和using结合使用,则可以嵌套它们:

try
{
    ...
    using ( MyThing thing = new MyThing() )
    {
        ...
    }
    ...
}
catch ( Exception e )
{
    ....
}
finally
{
    ....
}

(或者将try / catch / finally放入使用中):

using ( MyThing thing = new MyThing() )
{
    ...
    try
    {
        ...
    }
    catch ( Exception e )
    {
        ....
    }
    finally
    {
        ....
    }    
    ...
} // thing.Dispose is called now

或者,我们可以展开"使用"并在" finally"块中显式调用" Dispose",如@Quarrelsome所示,在" finally"(或者" catch"中)中添加所需的任何额外的异常处理或者-recovery代码。 )。

编辑:作为对@Toran Billups的回应,如果我们除了要确保调用Dispose方法之外还需要处理异常,则必须使用usingtry / catch / finally或者展开使用我认为没有其他方法可以完成我们想要的事情。

回答

我们需要一个try语句来捕获异常

我们可以在using块中使用try语句,也可以在try块中使用using块

但是我们需要使用try块来捕获发生的任何异常