2008-08-30 62 views
4

我试图利用使用块越来越多这些天,当我有一个对象,实现IDisposable但有一件事我没有想出是如何捕捉异常,因为我会在正常的try/catch/finally。 ..任何代码示例指向我在正确的方向?如何使用.NET 2.0在使用块中捕获异常?

编辑:通过阅读答复后修改了该问题。这是“如何在.NET 2.0的使用块中抛出异常?”但我实际上正在寻找一种方法来捕获使用块内的这些异常。


我正在寻找更多的细节,在滚动我自己的捕捉块内使用块。

编辑:我想避免的是不得不在我的使用块内使用try/catch/finally,就像@Blair所示。但也许这是一个非问题...

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

回答

7

我真的不明白这个问题 - 你会像平常那样抛出异常。 如果MyThing工具IDisposable,则:

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

而且thing.Dispose你离开块将被调用,因为异常的抛出。如果你想一个try/catch /终于结合和使用,您可以嵌套它们:

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

(或者把的try/catch /最后的使用):

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

或者你可以展开的using和显式调用Disposefinally块为@Quarrelsome证实,并称需要在finally(或catch)任何额外的异常处理或-recovery代码。

编辑:针对@Toran比卢普斯,如果你需要从确保您Dispose方法被调用一边处理异常,你要么必须使用usingtry/catch/finally或展开的using - 我不认为还有其他方法可以实现你想要的。

4

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

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

所以,你将不得不推出自己的追赶,如果你想赶上什么,但捕捉/投掷距离使用一个完全独立的问题。这个finally几乎可以保证执行(保存一个不可捕捉的异常(例如stackoverflow或outofmemory)或者将电源从PC中拔出)。

0

你需要有一个try语句捕捉异常

要么你可以使用块中使用try语句也可以在try块

使用using块,但你需要使用尝试阻止发生任何异常