2011-09-26 40 views
20

私はいくつかのコードを見ていて、e.ToString()を見つけましたが、.Messageの代わりにToString()メソッドを使用することに違いがあるのでしょうか?Exceptionの.ToString()と.Messageの違いは何ですか?

下記のように、それはより多くの情報を返すように聞こえる。 .NET Compact Frameworkによってサポートされてい

From Microsoft's Docs

ToStringメソッド 。 オーバーライドされました。現在の例外の文字列表現を作成して返します。

メッセージ .NET Compact Frameworkでサポートされています。 現在の例外を説明するメッセージを取得します。

+7

私は –

+0

例外があるあなた自身の質問に答えたと思いますオブジェクトはToStringを使用してオブジェクトをString(オブジェクト)に変換し、Namespace.Exceptionと同じになる可能性があります。 –

+3

@Ramhound: 'Exception'は' ToString'をオーバーライドします。 – SLaks

答えて

18

あなたが一度にできるだけ多くの情報を得るために探している場合は、ToString()を呼び出す:

ToStringメソッドのデフォルトの実装は、現在の例外、メッセージを投げたクラスの名前を取得し(私の強調)、内部例外でToStringを呼び出した結果、Environment.StackTraceを呼び出した結果。これらのメンバーのいずれかがNothingの場合、その値は返された文字列に含まれません。

、それが全てで組み込まれているなど、どれもnullでないことを確認するためにチェックし、あなたが一緒に自分自身をすべての個々の要素を追加する必要がないことが便利だ...

Exception.ToString Method

あなたは実際のソースコードはreference.microsoft.comでチェックアウトすることもできます。

0

ToStringメソッドは、エラーが発生した場所に関する情報とともにプロパティを返します。

Messageプロパティは、エラーの簡単な説明を目的としており、Exceptionを実装する人がそこに置いたものだけを含みます。 ToStringからの再送信には、常に含まれる追加情報が含まれています。

デバッグモードで実行している場合、エラーレポートにはより詳細な情報が含まれています。呼び出しスタック内の行番号。

5

ToString()は、StackTraceと一緒にMessageを返します。
ToString()もまた、再帰的にInnerExceptionsを含みます。

ToString()は、エラーを追跡するときには、Messageよりずっと長い文字列を返します。

2

あなたはいつもそれを試してみて見ることができました:。

try 
{ 
    throw new Exception("This is a test."); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex); 
    Console.WriteLine(ex.Message); 
} 

(あなたは、あなたが正しいことがわかります、.ToStringは、スタックトレースとりわけ含めて、より有益である

+4

このcatchブロックを代わりに使うべきです:catch(Exception ex) { Console.WriteLine( "#### TOSTRING ######"); Console.WriteLine例); Console.WriteLine(); Console.WriteLine( "####メッセージの結果######");; Console.WriteLine(ex.Message); } '。これは、OPの両方の出力を区別するのに役立ちます –

0

E。ToString()は、PrintTraceのような詳細なメッセージを表示します。どのDisplayが例外名であるのか、例外がスローされた行は、e.Messageの出力がReadable Messageで、仕様がない場合のみです。あなたは例外ベースのコンストラクタを確認することができます

12

のSystem.ExceptionのToStringメソッドが何をしているかを確認するために、.NETリフレクターまたは類似を使用してみてください:

[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] 
public override string ToString() 
{ 
    return this.ToString(true); 
} 

private string ToString(bool needFileLineInfo) 
{ 
    string className; 
    string message = this.Message; 
    if ((message == null) || (message.Length <= 0)) 
    { 
     className = this.GetClassName(); 
    } 
    else 
    { 
     className = this.GetClassName() + ": " + message; 
    } 
    if (this._innerException != null) 
    { 
     className = className + " ---> " + this._innerException.ToString(needFileLineInfo) + Environment.NewLine + " " + Environment.GetRuntimeResourceString("Exception_EndOfInnerExceptionStack"); 
    } 
    string stackTrace = this.GetStackTrace(needFileLineInfo); 
    if (stackTrace != null) 
    { 
     className = className + Environment.NewLine + stackTrace; 
    } 
    return className; 
} 
関連する問題