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

时间:2010-11-10 09:20:39

标签: .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

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

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

此功能最终通过WCF公开。

2 个答案:

答案 0 :(得分:6)

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

Catch ex As Exception
LogException (ex)
Throw

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

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

答案 1 :(得分:1)

在vb.net中,最好的事情是有时在处理“throw”之前记下(log)异常。 “当SomeConditionIsTrue”构造时,“将Ex作为WhateverException”非常强大。请注意,该条件可能有副作用,并将在堆栈展开之前进行评估。如果评估条件的代码有一个断点,那么断点将在异常有机会触发任何Finally ...子句之前被命中(这样你就可以检查在清理代码可以摆脱之前可能导致异常的对象)他们)。此外,如果异常最终未被处理,则会在抛出异常的位置和上下文中获得断点。