Tôi đang cố gắng khởi tạo một đối tượng đắt tiền, thông qua lớp Lazy của .NET, có thể bị lỗi do ngoại lệ. Ví dụ của lớp lười được lưu trữ bởi vì có khả năng khởi tạo lần thử tiếp theo có thể thành công. vì vậy tôi đang tạo ra các trường hợp như sau:Không thể bắt ngoại lệ được ném trong khi khởi tạo lười (C# .NET)
Lazy<someObject> lazyValue =
new Lazy<someObject>(() => { expensive initialization; },
System.Threading.LazyThreadSafetyMode.PublicationOnly);
Theo tài liệu .NET với PublicationOnly các ngoại lệ sẽ không được lưu trữ và do đó người ta có thể cố gắng để khởi tạo lại giá trị. Tôi chạy vào vấn đề mà ngoại lệ không thể bị bắt. Bây giờ nó là khá đơn giản để viết lớp lười biếng của riêng tôi nhưng tôi muốn tìm hiểu xem tôi đang sử dụng lớp Lazy của NET không chính xác hoặc là một lỗi của họ?
Sau đây (giản thể) mã sẽ tạo lại vấn đề:
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);
}
}
}
Làm việc cho tôi, in 'bắt tôi 0 bắt tôi 1 Được khởi tạo' – SLaks
hoạt động trên máy của tôi. Chạy nó mà không gỡ lỗi (CTRL-F5) – jeroenh
Tôi đã thử chạy nó với Ctrl-F5 và bên phải của bạn nó hoạt động nhưng hiện tại bất kỳ ai có lý do tại sao nó không hoạt động trong khi gỡ lỗi? – Rehan