English 中文(简体)
如何在.NET 2.0的using块中捕获异常?
原标题:
  • 时间:2008-08-30 16:19:22
  •  标签:

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

编辑:在阅读了回复后,对问题进行了修改。这是“如何用.NET 2.0在using块中抛出异常?”但实际上我在寻找一种方法来捕捉using块内的这些异常。


我正在寻找更多关于在使用方块中滚动我自己的接球方块的细节。

编辑:我想避免的是像@Blair展示的那样,在我的使用块内使用try/catch/finally。但也许这不是问题。。。

编辑:@Blair,这正是我想要的,谢谢你的详细回复!

最佳回答

I don t really understand the question - you throw an exception as you normally would. If MyThing implements IDisposable, then:

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

当您离开块时,会调用thing.Dispose,因为抛出了异常。如果您想将try/catch/finaly和using组合在一起,您可以嵌套它们:

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

(或者将try/catch/finally放在using中):

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

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

编辑:为了响应@Toran Billups,如果除了确保调用Dispose方法外,还需要处理异常,则必须使用try/catch/finaly使用来使用-我认为没有任何其他方法可以实现您想要的。

问题回答

Yeah there is nothing different about throwing exceptions in using blocks. Remember that the using block basically translates to:

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

因此,如果你想抓任何东西,你就必须自己抓,但抓/扔是一个与使用完全不同的问题。finally几乎可以保证执行(保存不可捕获的异常(例如stackoverflow或内存不足)或有人从PC中拔出电源)。

您需要有一个try语句来捕获异常

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

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





相关问题