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

编辑:看了大家的回复后修改了问题。这是“如何在使用.NET 2.0的使用块中抛出一个例外?”但是实际上,我正在寻找一种在使用块中捕获这些例外的方法。


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

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

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

有帮助吗?

解决方案

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

或者您可以展开 using 并显式调用 Dispose 在里面 finally 正如 @Quarrelsome 演示的那样,添加您需要的任何额外的异常处理或恢复代码 finally (或在 catch).

编辑:作为对@Toran Billups 的回应,如果您除了确保您的 Dispose 方法被调用,你要么必须使用 usingtry/catch/finally 或展开 using - 我认为没有其他方法可以实现你想要的。

其他提示

是的,在 using 块中抛出异常没有什么不同。请记住,using 块基本上翻译为:

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

因此,如果您想捕获任何东西,则必须自己进行捕获,但捕获/投掷与使用完全不同。最后几乎可以保证执行(保存一个无法捕获的异常(例如stackoverflow 或 outofmemory)或有人拔掉了 PC 的电源)。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top