为什么 .net 异常没有被捕获?

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

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


我运行了上面的代码,无法重现问题 - 它按预期工作,异常已被捕获。 - sergtk
请检查您的项目和构建发布配置是否启用了代码合同运行时合同检查。如果您仍然无法重现,请告诉我您正在使用的代码合同版本。谢谢。 - Alexander Bartosh
可重现,使用1.4.50327.0版本。奇怪 :-O - sergtk
1个回答

25

这是因为您在项目属性中启用了代码合同运行时合同检查,并且您正在使用发布配置。如果您是这样做的话,Code Contracts重写器将使用以下方式将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

    我正在使用代码合同,并希望尽快修复错误。 我已经发布了这个问题到代码合同论坛。唯一能够快速修复问题的方法是吸引足够的注意力。所以请投票支持,特别是在代码合同论坛上。

更新于2016年5月:

版本1.9.10714.2会产生不同的异常 Unhandled Exception: System.InvalidProgramException: Common Language Runtime detected an invalid program.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接