4

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

编辑:阅读回复后修改了问题。它是“如何使用 .NET 2.0 在 using 块中引发异常?” 但我实际上是在寻找一种在 using 块中捕获这些异常的方法。


我正在寻找更多关于在 using 块内滚动我自己的捕获块的详细信息。

编辑:我想避免的是必须在我的 using 块中使用 try/catch/finally,就像 @Blair 显示的那样。但也许这不是问题......

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

4

3 回答 3

7

我不太明白这个问题 - 你像往常一样抛出异常。如果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 中):

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

或者您可以像@Quarrelsome 演示的那样在块中展开using并显式调用,在(或)中添加您需要的任何额外的异常处理或-恢复代码。Disposefinallyfinallycatch

编辑:作为对@Toran Billups 的回应,如果除了确保Dispose调用您的方法之外,您还需要处理异常,您将不得不使用usingandtry/catch/finally或展开using- 我认为没有其他方法可以完成您的工作想。

于 2008-08-30T16:32:01.327 回答
4

是的,在使用块时抛出异常没有什么不同。请记住, using 块基本上转换为:

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

因此,如果您想捕获任何东西,但捕获/投掷与使用完全不同,您将不得不自己进行捕获。finally 几乎可以保证执行(保存无法捕获的异常(例如 stackoverflow 或内存不足)或有人将电源从 PC 中拉出)。

于 2008-08-30T16:27:31.353 回答
0

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

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

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

于 2010-05-21T21:01:09.357 回答