不能捕获在延迟初始化期间抛出的异常(c# . net)
本文关键字:异常 net 延迟 初始化 不能 | 更新日期: 2023-09-27 17:54:49
我试图通过。net的Lazy类初始化一个昂贵的对象,由于异常可能会失败。缓动类的实例被缓存,因为在后续尝试中初始化可能成功。因此,我按照如下方式创建实例:
Lazy<someObject> lazyValue =
new Lazy<someObject>(() => { expensive initialization; },
System.Threading.LazyThreadSafetyMode.PublicationOnly);
根据。net的文档PublicationOnly异常不会被缓存,因此可以尝试重新初始化该值。我遇到了异常无法被捕获的问题。现在写我自己的懒惰类是相当简单的,但我想知道如果我使用。net的懒惰类不正确还是他们的错误?
下面的(简化的)代码将重现这个问题:
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中运行,并在Debug> Exceptions菜单中检查ArgumentException,告诉它总是在那里中断?