我在谈论Try ... Catch ex as Exception .... End Try
如果我将异常传递给Error Logger,我应该传递异常对象(ex)还是ex.ToString
?通过ex.ToString
?
基本上我和我的经理争论说,ex.ToString应该像传递ex作为一个对象一样兴奋。我错了还是对吗?
答案 0 :(得分:6)
一个是异常对象,一个是在异常对象上调用ToString
的字符串结果。
它们是不同的类型,并且有不同的信息。
对于日志记录目的,由于记录器通常会在异常对象上调用ToString
,因此差别不大。
但是,最好将其集中在一起 - 让异常记录器调用ToString
而不是在记录器的每个调用站点中执行此操作。它更易于维护,如果需要,可以在将来例外处理更多事情。
答案 1 :(得分:4)
异常对象与在对象本身上调用.ToString()
不同。这取决于您想要捕获有关异常本身的信息量。如果您只是想要消息,那么调用.ToString()
就足够了,因为它最终会从异常对象中提供message属性。属于基本异常类的MSDN站点lists different properties。如果要记录这些属性中的任何一个,那么您将需要异常 class ,而不仅仅是消息字符串。
另请注意,继承基本异常类的不同类提供了其他信息。例如,HttpException class provides additional properties。根据您需要查看的故障排除信息,该信息可能很有用。
答案 2 :(得分:1)
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()和堆栈跟踪。
答案 3 :(得分:0)
异常对象与.ToString()不同。它具有多种属性,如果您只需要传递消息,则可以使用Ex.Message;