2011-05-05 61 views
8

我想通過.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

回答

5

嗯,它看起來像它應該工作。如果你說它拋出異常但沒有捕獲異常,那麼...無論如何,你是否在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