如何使用 .NET 2.0 捕获 using 块中的异常?
-
09-06-2019 - |
题
这些天,当我有一个实现 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
方法被调用,你要么必须使用 using
和 try/catch/finally
或展开 using
- 我认为没有其他方法可以实现你想要的。
其他提示
是的,在 using 块中抛出异常没有什么不同。请记住,using 块基本上翻译为:
IDisposable disposable = null;
try
{
disposable = new WhateverYouWantedToMake();
}
finally
{
disposable.Dispose()
}
因此,如果您想捕获任何东西,则必须自己进行捕获,但捕获/投掷与使用完全不同。最后几乎可以保证执行(保存一个无法捕获的异常(例如stackoverflow 或 outofmemory)或有人拔掉了 PC 的电源)。
您需要有一个 try 语句来捕获异常
您可以在 using 块中使用 try 语句,也可以在 try 块中使用 using 块
但是您需要使用 try 块来捕获发生的任何异常