如何在.NET 2.0的using块中捕获异常?
这些天,当我有一个实现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
方法之外还需要处理异常,则必须使用using
和try / catch / finally
或者展开使用
我认为没有其他方法可以完成我们想要的事情。
回答
我们需要一个try语句来捕获异常
我们可以在using块中使用try语句,也可以在try块中使用using块
但是我们需要使用try块来捕获发生的任何异常