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

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

问题描述:

我想通过.NET的Lazy类初始化一个昂贵的对象,该对象可能因异常而失败。缓存类的实例被缓存,因为后续尝试初始化可能会成功。因此,我要创建实例如下:无法捕获延迟初始化期间抛出的异常(C#.NET)

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); 
     } 
    } 
} 
+2

它适用于我,印刷'赶我0 接我1 初始化' – SLaks 2011-05-05 13:18:16

+0

适用于我的机器。在不调试的情况下运行它(CTRL-F5) – jeroenh 2011-05-05 13:19:50

+1

我试着用Ctrl-F5运行它,你的权利它确实工作,但现在有人为什么它在调试过程中不起作用? – Rehan 2011-05-05 13:23:46

嗯,它看起来像它应该工作。如果你说它抛出异常但没有捕获异常,那么...无论如何,你是否在Visual Studio中运行,并且在调试>异常菜单中检查了ArgumentException,以告诉它总是在那里打破?

+0

异常的类型并不重要,它也发生在System.Exception中,是的,我说它被抛出并且没有被捕获... – Rehan 2011-05-05 13:23:16

+0

@Rehan那么,在上面的注释中,你说没有调试就运行。这表明我可能是正确的。你检查了调试>例外菜单吗? – Tesserex 2011-05-05 13:29:39

+2

你是对的,Visual Studio被设置为总是打破,但我感到困惑,因为当它打破异常框弹出的标题:“异常是由用户代码未处理”,这显然是。 – Rehan 2011-05-05 13:30:39