【问题标题】:Can't catch exception thrown during lazy initialization (C# .NET)无法捕获延迟初始化期间引发的异常(C# .NET)
【发布时间】:2011-05-05 21:19:39
【问题描述】:

我正在尝试通过 .NET 的 Lazy 类初始化一个昂贵的对象,该对象可能由于异常而失败。惰性类的实例被缓存,因为在后续尝试初始化时可能会成功。因此,我按如下方式创建实例:

Lazy<someObject> lazyValue =
    new Lazy<someObject>(() => { expensive initialization; }, 
        System.Threading.LazyThreadSafetyMode.PublicationOnly);

根据带有 PublicationOnly 的 .NET 文档,该异常不会被缓存,因此可以尝试重新初始化该值。我遇到了无法捕获异常的问题。现在编写自己的惰性类相当简单,但我想知道我是否错误地使用了 .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);
        }
    }
}

【问题讨论】:

  • 它对我有用,打印catch me 0 catch me 1 Initialized
  • 在我的机器上工作。在不调试的情况下运行它(CTRL-F5)
  • 我试过用 Ctrl-F5 运行它,你的权利它确实可以工作,但现在有人知道为什么它在调试过程中不工作了吗?

标签: c# .net


【解决方案1】:

嗯,看起来应该可以了。如果你说它抛出异常但没有捕获它,那么......你是否在 Visual Studio 中运行,并在“调试”>“异常”菜单中检查了 ArgumentException 以告诉它总是在那里中断?

【讨论】:

  • 异常的类型无关紧要,它也会发生在 System.Exception 中,是的,我是说它被抛出而不是被捕获......
  • @Rehan 好吧,在上面的 cmets 中,您说无需调试即可运行。这表明我可能是正确的。你检查过 Debug > Exceptions 菜单吗?
  • 你是对的,Visual Studio 被设置为总是中断,但我很困惑,因为当它中断时会弹出异常框,标题为:“异常未被用户代码处理”,这显然是。
猜你喜欢
  • 2012-07-27
  • 2014-03-21
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多