我有一个方法如下:
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公开。
答案 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 ...子句之前被命中(这样你就可以检查在清理代码可以摆脱之前可能导致异常的对象)他们)。此外,如果异常最终未被处理,则会在抛出异常的位置和上下文中获得断点。