2012-06-02 44 views
10

Hãy xem xét các chương trình sau "an toàn":Tại sao ngoại lệ .net không bị phát hiện?

internal class Safe 
{ 
    public static void SafeMethodWillNeverThrow() 
    { 
     try 
     { 
      var something = ThrowsNewException(); 
      Func<int, string> x = p => something.ToString(); 
     } 
     catch (Exception) 
     { 
     } 
    } 

    private static object ThrowsNewException() 
    { 
     throw new Exception(); 
    } 

    public static void Main() 
    { 
     SafeMethodWillNeverThrow(); 
    } 
} 

Nó sẽ không bao giờ hoàn chỉnh với một ngoại lệ. Nhưng tại sao nó không thành công khi tôi chạy nó? Tại sao SafeMethodWillNeverThrow() ném ngoại lệ?

Trước khi thử nghiệm mã này, vui lòng đọc câu trả lời bên dưới.

+0

Tôi chạy mã ở trên và không thể tạo lại vấn đề - nó hoạt động như mong đợi, ngoại lệ bị bắt – sergtk

+0

Vui lòng kiểm tra xem bạn đã bật Kiểm tra hợp đồng thời gian chạy mã hợp đồng cho bạn và bạn xây dựng cấu hình phát hành. Tôi bạn vẫn không thể tái tạo nó, xin vui lòng cho tôi biết phiên bản của các hợp đồng mã bạn đang sử dụng. Cảm ơn –

+0

có thể tái tạo với 1.4.50327.0. Lạ: -O – sergtk

Trả lời

25

Đó là vì bạn đã kiểm tra hợp đồng thời gian chạy mã hợp đồng được kích hoạt trong thuộc tính dự án của bạn mà bạn sử dụng cấu hình phát hành. Và nếu bạn đang sử dụng, phương thức SafeMethodWillNeverThrow() của bạn sẽ được chuyển đổi thành phần sau với sự giúp đỡ của Code Contracts rewriter:

public static void SafeMethodWillNeverThrow() 
{ 
    object something = ThrowsNewException(); 
    try 
    { 
     Func<int, string> func1 = p => something.ToString(); 
    } 
    catch (Exception) 
    { 
    } 
} 

Ouch!

Kết luận: Đừng tin vào những gì bạn thấy - đọc IL :).

Vấn đề là tái sản xuất với sau Mã Hợp đồng phiên bản:

  1. 1.4.50327.0
  2. 1.4.50126.1

    Tôi đang sử dụng Hợp đồng Mã và muốn có lỗi cố định càng sớm càng tốt. Tôi đã đăng nó lên Code Contracts forum. Cách duy nhất để có nó cố định sớm là thu hút đủ sự chú ý đến nó. Vì vậy, hãy bỏ phiếu lên, đặc biệt là trên các diễn đàn Hợp đồng Mã

Cập nhật tháng 5 năm 2016:

Version 1.9.10714.2 đưa ra một ngoại lệ khác nhau Unhandled Exception: System.InvalidProgramException: Common Language Runtime phát hiện một chương trình không hợp lệ.

+0

Viết lại 'đẹp'! * rùng mình * –

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