using
显然,在使用嵌套语句时,一些异常可能会丢失。考虑这个简单的控制台应用程序:
using System;
namespace ConsoleApplication
{
public class Throwing: IDisposable
{
int n;
public Throwing(int n)
{
this.n = n;
}
public void Dispose()
{
var e = new ApplicationException(String.Format("Throwing({0})", this.n));
Console.WriteLine("Throw: {0}", e.Message);
throw e;
}
}
class Program
{
static void DoWork()
{
// ...
using (var a = new Throwing(1))
{
// ...
using (var b = new Throwing(2))
{
// ...
using (var c = new Throwing(3))
{
// ...
}
}
}
}
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
// this doesn't get called
Console.WriteLine("UnhandledException:", e.ExceptionObject.ToString());
};
try
{
DoWork();
}
catch (Exception e)
{
// this handles Throwing(1) only
Console.WriteLine("Handle: {0}", e.Message);
}
Console.ReadLine();
}
}
}
每个实例在Throwing
处理时都会抛出。AppDomain.CurrentDomain.UnhandledException
永远不会被调用。
输出:
投掷:投掷(3) 投掷:投掷(2) 投掷:投掷(1) 手柄:投掷(1)
我希望至少能够记录丢失的Throwing(2)
和Throwing(3)
. 我该如何做到这一点,而无需try/catch
为每个using
单独使用(这会破坏 的便利性using
)?
在现实生活中,这些对象通常是我无法控制的类的实例。他们可能会或可能不会抛出,但如果他们这样做,我希望可以选择观察此类异常。
当我正在考虑降低嵌套的级别时,using
这个问题出现了。有一个简洁的答案建议聚合异常。有趣的是,这与嵌套using
语句的标准行为有何不同。
[编辑]这个问题似乎密切相关: 您是否应该实现 IDisposable.Dispose() 以便它永远不会抛出?