Dot-Net

為什麼.net 異常沒有被擷取?

  • May 9, 2016

考慮以下“安全”程序:

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() 會拋出異常?

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

這是因為您在使用發布配置的項目屬性中啟用了程式碼契約執行時契約檢查。如果你是,你的 SafeMethodWillNeverThrow() 方法會在 Code Contracts 重寫器的幫助下轉換為以下內容:

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 論壇上

2016 年 5 月更新:

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

引用自:https://stackoverflow.com/questions/10866307