无法捕获延迟初始化期间抛出的异常(C#.NET)

时间:2011-05-05 13:13:48

标签: c# .net

我试图通过.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);
        }
    }
}

1 个答案:

答案 0 :(得分:5)

好吧,它看起来应该有效。如果你说它抛出了异常而没有抓住它,那么......你是否在Visual Studio中运行,并且在Debug&gt;中检查了ArgumentException。告诉它总是在那里打破的例外菜单?