10

考虑以下“安全”程序:

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() 会抛出异常?

在测试此代码之前,请阅读下面的答案。

4

1 回答 1

25

这是因为您在使用发布配置的项目属性中启用了代码合同运行时合同检查。如果你是,你的 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:公共语言运行时检测到无效程序。

于 2012-06-02T22:07:23.490 回答