【问题标题】:Why .net exception is not caught?为什么.net 异常没有被捕获?
【发布时间】:2012-06-02 22:07:23
【问题描述】:

考虑以下“安全”程序:

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

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

【问题讨论】:

  • 我运行了上面的代码,但无法重现问题 - 它按预期工作,异常被捕获
  • 请检查您是否为您的项目启用了代码合同运行时合同检查,并且您构建了发布配置。我仍然无法复制它,请让我知道您正在使用的代码合同版本。谢谢
  • 可以用 1.4.50327.0 重现。奇怪:-O

标签: .net exception exception-handling code-contracts


【解决方案1】:

这是因为您在使用发布配置的项目属性中启用了代码合同运行时合同检查。如果你是,你的 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 forum。尽快修复它的唯一方法是吸引足够的注意力。所以请投票,尤其是在 Code Contracts 论坛上

2016 年 5 月更新:

版本 1.9.10714.2 给出了不同的例外 未处理的异常:System.InvalidProgramException:公共语言运行时检测到无效程序。

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2017-06-18
    • 2010-11-16
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多