2010-11-10 147 views
0

我有一个方法如下:捕捉异常,日志记录和重新抛出 - 我有这个错误吗?

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公开。

回答

6

最好登录处理程序,然后从那里抛出。其他方面,你会失去最初例外的堆栈和其他细节。

Catch ex As Exception 
LogException (ex) 
Throw 

也暴露出功能时,在WCF应确保异常代码可在客户端,如果你有自定义异常如需要使用WCF故障运输它们。

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

+0

好吧,所以你做的第一点是我认为我会改变我的代码。 WCF将被Java客户端使用 - 我会遇到问题吗? – youwhut 2010-11-10 09:28:31

+1

其实下面的答案是一个很好的帮助:http://stackoverflow.com/questions/1369882/wcf-web-service-custom-exception-error-to-client/1369956#1369956 – youwhut 2010-11-10 09:40:19

1

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