不能捕获在延迟初始化期间抛出的异常(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);
        }
    }
}

不能捕获在延迟初始化期间抛出的异常(c# . net)

看起来应该可以工作。如果你说它抛出了异常,但没有捕捉到它,那么…无论如何,你是否在Visual Studio中运行,并在Debug> Exceptions菜单中检查ArgumentException,告诉它总是在那里中断?