捕获异常,记录和重新抛出 - 我有错吗?

you*_*hut 0 .net vb.net exception-handling

我有一个方法如下:

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
Run Code Online (Sandbox Code Playgroud)

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

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

此功能最终通过WCF公开.

Pre*_*gha 6

最好登录处理程序然后从那里抛出.另外,你会从原始异常中丢失堆栈和其他细节.

Catch ex As Exception
LogException (ex)
Throw
Run Code Online (Sandbox Code Playgroud)

此外,当通过WCF公开功能时,如果您有需要使用WCF故障传输它们的自定义异常,则应确保客户端上的异常代码可用.

如果消费者不是.net,那么这非常重要,您需要公开包含将由客户端解码的问题的详细信息的FaultContracts.有关详细信息,请参阅此处:客户端的WCF Web服务自定义异常错误