2012-06-02 98 views
10

考慮下面的「安全」計劃:爲什麼.net異常不被捕獲?

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(); 
    } 
} 

絕不應該配有一個例外。 但是爲什麼當我運行它失敗?爲什麼SafeMethodWillNeverThrow()拋出異常?

測試此代碼之前,請閱讀下面的答案。

+0

我運行上面的代碼,並且無法重現問題 - 它按預期工作,異常被捕獲 – sergtk

+0

請檢查是否爲您的項目啓用了代碼合同運行時合同檢查,然後構建發佈配置。我仍然無法重現它,請讓我知道您使用的代碼合同的版本。謝謝 –

+0

與1.4.50327.0重現。奇怪:-O – sergtk

回答

25

這是因爲您在使用版本配置的項目屬性中啓用了代碼合同運行時合同檢查。如果你是,你SafeMethodWillNeverThrow()方法轉換爲與代碼的幫助下,下列合同重寫:

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

哎喲!

結論:不要相信你所看到的 - 閱讀IL :)。

的問題是重複性與下面的代碼合同版本:

  1. 1.4.50327.0
  2. 1.4.50126.1

    我使用代碼契約,並希望有錯誤儘快修復。 我已將它發佈到Code Contracts forum。要儘快修復它的唯一方法是吸引足夠的關注。所以,請投了起來,尤其是在代碼契約論壇

更新2016年5月:

版本1.9.10714.2給出了一個不同的異常 未處理的異常:System.InvalidProgramException:公共語言運行庫檢測到無效的程序。

+0

'尼斯'重寫! *不寒而慄* –