私は話しているTry ... Catch ex as Exception .... End Try
Error Logger に例外を渡す場合、例外オブジェクト (例) または を渡す必要がありますかex.ToString
? を渡すと情報が失われex.ToString
ますか?
基本的に、ex.ToString は ex をオブジェクトとして渡すのとまったく同じであるべきだとマネージャーと議論していました。MI 間違っているか正しいか?
1 つは例外オブジェクトで、もう 1 つは例外オブジェクトを呼び出しToString
た結果の文字列です。
それらは異なるタイプであり、異なる情報を持っています。
ToString
ロギングの目的では、ロガーは通常例外オブジェクトを呼び出すため、ほとんど違いはありません。
ToString
ただし、これを一元化することをお勧めします。ロガーへのすべての呼び出しサイトでこれを行うのではなく、例外ロガー呼び出しを行います。より保守しやすく、必要に応じて将来的に例外を除いて、より多くのことを行うことができます。
例外オブジェクトは.ToString()
、オブジェクト自体の呼び出しとは異なります。それは、例外自体についてどの程度の情報を取得したいかによって異なります。メッセージだけが必要な場合は、呼び出し.ToString()
で十分です。これは、例外オブジェクトからメッセージ プロパティを取得することになるためです。MSDN サイトには、基本例外クラスに属するさまざまなプロパティが一覧表示されています。これらのプロパティのいずれかをログに記録する場合は、メッセージ文字列だけでなく、例外クラスが必要になります。
また、基本例外クラスを継承するさまざまなクラスが追加情報を提供することにも注意してください。例として、HttpException クラスは追加のプロパティを提供します。その情報は、トラブルシューティングのために何を確認する必要があるかによって役立ちます。
exception
オブジェクトには、 の結果よりも多くの情報が含まれます.ToString()
。少なくとも、その情報はより有用な形式になります (つまり、個々の部分を簡単に取得できます)。
ロガーで行うことは、exception.ToString()
他に何も使用せずに呼び出すだけの場合、現在のところ、実際の違いはありません。ただし、例外オブジェクトを渡すことは、将来の証明のためにおそらく優れています (つまり、例外のプロパティがさらに必要になった場合)。
その価値があるのは、次のオーバーロードをパラメーターとしてToString
渡すことです。true
Private Function ToString(ByVal needFileLineInfo As Boolean) As String
Dim className As String
Dim message As String = Me.Message
If ((message Is Nothing) OrElse (message.Length <= 0)) Then
className = Me.GetClassName
Else
className = (Me.GetClassName & ": " & message)
End If
If (Not Me._innerException Is Nothing) Then
className = String.Concat(New String() { className, " ---> ", Me._innerException.ToString(needFileLineInfo), Environment.NewLine, " ", Environment.GetRuntimeResourceString("Exception_EndOfInnerExceptionStack") })
End If
Dim stackTrace As String = Me.GetStackTrace(needFileLineInfo)
If (Not stackTrace Is Nothing) Then
className = (className & Environment.NewLine & stackTrace)
End If
Return className
End Function
ご覧のとおり、基本的にクラス、メッセージ、innerexception.ToString()、およびスタック トレースを出力します。
例外オブジェクトは.ToString()とは異なります。さまざまなプロパティがあり、メッセージのみを渡す必要がある場合は、次を使用できます。Ex.Message;