私は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
私は誰にでもバグのように聞こえるのですか?
問題のバスを少しでも解決できない場合は、Exceptionからクラスを派生させるべきではありません。ApplicationExceptionから派生します。 - http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet –
ありがとう! –
'ApplicationException'と' Exception'に関しては、 'ApplicationException'を使用しない**のガイドラインがあります。参照:http://stackoverflow.com/a/52770/66849 – PHeiberg