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

これは、リリース構成を使用するプロジェクト プロパティで Code Contracts Runtime Contract Checking が有効になっているためです。もしそうなら、あなたの SafeMethodWillNeverThrow() メソッドは Code Contracts リライタの助けを借りて次のように変換されます:

public static void SafeMethodWillNeverThrow()
{
    object something = ThrowsNewException();
    try
    {
        Func<int, string> func1 = p => something.ToString();
    }
    catch (Exception)
    {
    }
}

痛い!

結論:あなたが見るものを信頼しないでください-ILを読んでください:)。

この問題は、次の Code Contracts バージョンで再現可能です。

  1. 1.4.50327.0

  2. 1.4.50126.1

    Code Contracts を使用しており、できるだけ早くエラーを修正したいと考えています。Code Contracts forumに投稿しました。すぐに修正する唯一の方法は、十分な注目を集めることです。ですから、特に Code Contracts フォーラムで投票してください。

2016 年 5 月の更新:

バージョン 1.9.10714.2 では、別の例外 Unhandled Exception: System.InvalidProgramException: 共通言語ランタイムが無効なプログラムを検出しました。

于 2012-06-02T22:07:23.490 に答える