2012-11-09 9 views
5

私はException.ToString()を使用して例外を報告するテストフレームワークを使用しています。.NET 4.0ではException.ToStringが壊れていますか?

私は昨日、ネストされた例外の不完全な報告に走った、とリフレクターとのいくつかの作業は、.NET 4.0が文字列表現を構成しているか、内部例外壊れているという結論に達した後。

次に例を示します。

public class MyException : Exception 
{ 
    DateTime when; 

    public MyException(DateTime when) 
    { 
    this.when = when; 
    } 

    public override string ToString() 
    { 
    var builder = new StringBuilder(); 
    builder.AppendFormat("Happened at: {0}\r\n", this.when); 
    builder.Append(base.ToString()); 
    return builder.ToString(); 
    } 
} 

class Program 
{ 
    private static void throws() 
    { 
    throw new Exception("bobby!", new MyException(DateTime.Now)); 
    } 

    private static void catches() 
    { 
    try 
    { 
     throws(); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e); 
    } 
    } 

    static void Main(string[] args) 
    { 
    catches(); 
    } 
} 

ここでコンソール出力がは接頭辞「で起こった」私のカスタムは含まれません。

別の例外でネストされていないMyExceptionを直接スローすると、カスタム文字列repが使用されることに注意してください。

それは理由が判明はException.ToString()は、もはや内部例外のToString()を呼び出すのではなく、民間の方法、ToStringメソッド(ブール値)ということではありませんつまり

// Exception 
public override string ToString() 
{ 
    return this.ToString(true); 
} 

private string ToString(bool needFileLineInfo) 
{ 
    // yada yada 

    if (this._innerException != null) 
    { 
    result += "some stuff " + this._innerException.ToString(needFileLineInfo) + " some more stuff"; 
                ^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    } 

    // yada yada 

    return result; 
} 

ので、例外以来。 ToString()は内部例外のToString()を呼び出さなくなり、インプリメンテーションは内部例外に対するカスタマイズされた文字列表現の機会を短絡させました。 .NET 2.0では

、オーバーライドのToString()は予想通りと呼ばれる、これはどこかの道に沿ってブレイク変更ありました。

文書は変更されておらず、依然として主張しています。

ToStringメソッドのデフォルトの実装では、現在の例外をスローしたクラス 、メッセージ、内部例外で ToStringメソッドを呼び出した結果の名前を取得[...]

http://msdn.microsoft.com/en-us/library/system.exception.tostring.aspx

私は誰にでもバグのように聞こえるのですか?

+1

問題のバスを少しでも解決できない場合は、Exceptionからクラスを派生させるべきではありません。ApplicationExceptionから派生します。 - http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet –

+1

ありがとう! –

+6

'ApplicationException'と' Exception'に関しては、 'ApplicationException'を使用しない**のガイドラインがあります。参照:http://stackoverflow.com/a/52770/66849 – PHeiberg

答えて

7

はい、バグのようです。 MS Connect issueをご覧ください。

+0

ありがとう!私は昨日コネクトを検索していましたが、関連するものは何も見つかりませんでした。今すぐ次のメジャーリリースが出てくるまで、私は息を止めていきます: –

+0

ところで、誰もがこれをチェックできる.NET 4.5環境を持っていますか?問題は2010年9月に閉鎖されたので、4.5にするべきだったように感じる...ありがとう! –

+1

残念ながら、これは.NET 4.5では修正されていません。 http://referencesource.microsoft.com/netframework.aspxからソースコードをダウンロードして自分で確認することもできます。あなたが本当にあなたの息を止めようと思っているなら、あなたは知っているでしょう:) – Patko

関連する問題