我想通過.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);
}
}
}
它適用於我,印刷'趕我0 接我1 初始化' – SLaks 2011-05-05 13:18:16
適用於我的機器。在不調試的情況下運行它(CTRL-F5) – jeroenh 2011-05-05 13:19:50
我試着用Ctrl-F5運行它,你的權利它確實工作,但現在有人爲什麼它在調試過程中不起作用? – Rehan 2011-05-05 13:23:46