我在谈论Try ... Catch ex as Exception .... End Try
如果我将异常传递给错误记录器,我应该传递异常对象(ex)还是ex.ToString
?我会通过传递丢失任何信息ex.ToString
吗?
基本上我在和我的经理争论,那个 ex.ToString 应该与将 ex 作为对象传递完全一样。米是对还是错?
一个是异常对象,一个是调用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;