无法捕获延迟初始化期间抛出的异常(C#.NET)
问题描述:
我想通过.NET的Lazy类初始化一个昂贵的对象,该对象可能因异常而失败。缓存类的实例被缓存,因为后续尝试初始化可能会成功。因此,我要创建实例如下:无法捕获延迟初始化期间抛出的异常(C#.NET)
Lazy<someObject> lazyValue =
new Lazy<someObject>(() => { expensive initialization; },
System.Threading.LazyThreadSafetyMode.PublicationOnly);
根据.NET与PublicationOnly异常文件将不被缓存,因此可以尝试重新初始化值。我遇到了无法捕获异常的问题。现在编写我自己的懒惰类是相当简单的,但我想知道我是否错误地使用了.NET的Lazy类,或者是他们的错误?
以下(简化)代码将重现该问题:
private static void DoesntWork()
{
int i = 0;
Lazy<string> lazyValue = new Lazy<string>(() =>
{
if (i < 2)
{
throw new Exception("catch me " + i);
}
return "Initialized";
}, System.Threading.LazyThreadSafetyMode.PublicationOnly);
for (; i < 3; i++)
{
try
{
Console.WriteLine(lazyValue.Value);
}
catch (Exception exc) // I do not catch the exception!
{
Console.WriteLine(exc.Message);
}
}
}
答
嗯,它看起来像它应该工作。如果你说它抛出异常但没有捕获异常,那么...无论如何,你是否在Visual Studio中运行,并且在调试>异常菜单中检查了ArgumentException,以告诉它总是在那里打破?
它适用于我,印刷'赶我0 接我1 初始化' – SLaks 2011-05-05 13:18:16
适用于我的机器。在不调试的情况下运行它(CTRL-F5) – jeroenh 2011-05-05 13:19:50
我试着用Ctrl-F5运行它,你的权利它确实工作,但现在有人为什么它在调试过程中不起作用? – Rehan 2011-05-05 13:23:46