ex vs ex.ToString之间有什么区别吗? asp.net

时间:2012-10-12 14:56:36

标签: asp.net vb.net exception try-catch

我在谈论Try ... Catch ex as Exception .... End Try

如果我将异常传递给Error Logger,我应该传递异常对象(ex)还是ex.ToString?通过ex.ToString

会丢失任何信息吗?

基本上我和我的经理争论说,ex.ToString应该像传递ex作为一个对象一样兴奋。我错了还是对吗?

4 个答案:

答案 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;