【问题标题】:Is there any difference between ex vs ex.ToString? asp.netex 与 ex.ToString 之间有什么区别吗?网
【发布时间】:2012-10-03 10:16:24
【问题描述】:

我说的是Try ... Catch ex as Exception .... End Try

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

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

【问题讨论】:

  • 你肯定错了..还有一件事,永远不要和你的经理争论.. :D
  • 在您想要显示、打印或记录某些内容的最后阶段使用字符串。记录器应决定何时以及如何将异常转换为字符串。
  • 哈哈..好吧..我说争论但我只是很有礼貌地争论:D
  • 谢谢蒂姆 .. 现在我明白了,但我正在努力决定选择哪一个作为答案:D
  • @LaurenceNyein:如果有多个同样好的答案,我通常按最旧的排序并选择第一个发布的答案。这是最公平的方式。当然,当然 +1 所有你认为有帮助的人。

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


【解决方案1】:

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

另请注意,继承基异常类的不同类会提供附加信息。例如,HttpException class provides additional properties。这些信息可能很有用,具体取决于您需要查看哪些内容以进行故障排除。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      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() 和堆栈跟踪。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我强烈反对只使用 Ex.Message @Zo Has。您丢失了堆栈跟踪。虽然在极少数情况下这可能没问题,但通常堆栈跟踪是有价值的,值得保存。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 2011-01-24
        • 2023-02-17
        • 2013-09-13
        • 2017-04-05
        • 2014-09-18
        相关资源
        最近更新 更多