2

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

如果我将异常传递给错误记录器,我应该传递异常对象(ex)还是ex.ToString?我会通过传递丢失任何信息ex.ToString吗?

基本上我在和我的经理争论,那个 ex.ToString 应该与将 ex 作为对象传递完全一样。米是对还是错?

4

4 回答 4

6

一个是异常对象,一个是调用ToString异常对象的字符串结果。

它们是不同的类型,具有不同的信息。

出于记录目的,记录器通常会调用ToString异常对象,因此差别不大。

但是,最好集中处理 - 调用异常记录器ToString,而不是在记录器的每个调用站点都这样做。它更易于维护,并且可以让您在未来做更多的事情,如果需要的话。

于 2012-10-12T14:58:11.550 回答
4

异常对象不同于调用.ToString()对象本身。这取决于您想要捕获多少关于异常本身的信息。如果您只想要消息,那么调用.ToString()就足够了,因为这最终会为您提供异常对象中的消息属性。MSDN 站点列出了属于基本异常类的不同属性。如果您想记录这些属性中的任何一个,那么您将需要异常而不仅仅是消息字符串。

另请注意,继承基异常类的不同类提供了附加信息。例如,HttpException 类提供了额外的属性。该信息可能很有用,具体取决于您在进行故障排除时需要查看的内容。

于 2012-10-12T14:57:43.953 回答
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() 和堆栈跟踪。

于 2012-10-12T15:00:20.580 回答
0

异常对象不同于 .ToString()。它有各种各样的属性,如果你只需要传递消息,你可以使用Ex.Message;

于 2012-10-12T15:00:34.447 回答