【问题标题】:Catching Exception, logging and rethrowing - have I got this wrong?捕获异常,记录和重新抛出 - 我错了吗?
【发布时间】:2010-11-10 09:20:38
【问题描述】:

我有一个方法如下:

Public Sub Send()

    Dim caughtException As Exception = Nothing
    Try
        //Attempt action.
    Catch ex As Exception //Custom exceptions which can be thrown all inherit from Exception.
        //Instantiate error object to be logged.
        caughtException = ex
    End Try

    //Log action and if there is an error log this too.

    If caughtException IsNot Nothing Then Throw caughtException

End Sub

我必须为报告记录错误,经过研究,重新抛出异常是正确的做法。我关心的是堆栈信息的保存。

为了保持代码干燥,我将操作记录在一个地方 - 在捕获异常之后。

此功能最终通过 WCF 公开。

【问题讨论】:

    标签: .net vb.net exception-handling


    【解决方案1】:

    最好登录处理程序,然后从那里抛出。否则,您会丢失原始异常中的堆栈和其他详细信息。

    Catch ex As Exception
    LogException (ex)
    Throw
    

    此外,在通过 WCF 公开功能时,如果您有自定义异常需要使用 WCF 错误传输它们,则应确保异常代码在客户端可用。

    如果消费者不是.net,这非常重要,您需要公开FaultContracts,其中包含将由客户端解码的问题的详细信息。详情见这里:WCF Web Service Custom Exception Error to Client

    【讨论】:

    • 好的,所以你提出的第一点就是我的想法,我会修改我的代码。 WCF 将由 Java 客户端使用 - 我会遇到问题吗?
    • 其实下面这个答案很有帮助:stackoverflow.com/questions/1369882/…
    【解决方案2】:

    在 vb.net 中,有时最好在处理“抛出”之前记下(记录)异常。 “当 SomeConditionIsTrue 时捕获 Ex as WhatExceptionException”结构非常强大。请注意,条件可能有副作用,并且将在堆栈展开之前进行评估。如果评估条件的代码有断点,断点将在异常有机会触发任何 finally... 子句之前被命中(因此您可以在清理代码摆脱之前检查可能导致异常的对象其中)。此外,如果异常最终以其他方式未处理,则会在引发异常的位置和上下文处获得一个断点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 2013-06-24
      • 2012-03-25
      • 2012-02-21
      • 2015-11-18
      • 1970-01-01
      • 2011-11-25
      相关资源
      最近更新 更多