我试图通过.NET的Lazy类初始化一个昂贵的对象,它可能因异常而失败。惰性类的实例是缓存的,因为在后续尝试中初始化可能会成功。因此,我按如下方式创建实例:
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);
}
}
}
答案 0 :(得分:5)
好吧,它看起来应该有效。如果你说它抛出了异常而没有抓住它,那么......你是否在Visual Studio中运行,并且在Debug&gt;中检查了ArgumentException。告诉它总是在那里打破的例外菜单?