2012-06-02 67 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

'尼斯'重写! *不寒而栗* –