2011-05-05 33 views
8

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

Làm việc cho tôi, in 'bắt tôi 0 bắt tôi 1 Được khởi tạo' – SLaks

+0

hoạt động trên máy của tôi. Chạy nó mà không gỡ lỗi (CTRL-F5) – jeroenh

+1

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

Trả lời

5

Vâng, có vẻ như nó sẽ làm việc. Nếu bạn đang nói rằng nó ném ngoại lệ nhưng không bắt nó, sau đó ... bởi bất kỳ cơ hội, là bạn đang chạy trong Visual Studio, và có ArgumentException kiểm tra trong trình đơn Debug> Exceptions cho nó luôn luôn phá vỡ ở đó?

+0

Loại ngoại lệ không quan trọng, nó cũng xảy ra với System.Exception và có tôi đang nói rằng nó được ném và không bị bắt ... – Rehan

+0

@Rehan Vâng, trong các chú thích ở trên bạn nói rằng chạy mà không gỡ lỗi hoạt động. Điều này cho thấy tôi có thể đúng. Bạn đã kiểm tra trình đơn Debug> Exceptions chưa? – Tesserex

+2

Bạn chính xác, Visual Studio đã được thiết lập để luôn luôn phá vỡ nhưng tôi đã bối rối vì khi nó phá vỡ hộp ngoại lệ bật lên với tiêu đề: "Ngoại lệ được unhandled bởi mã người dùng", mà nó rõ ràng là. – Rehan

Các vấn đề liên quan