代码之家  ›  专栏  ›  技术社区  ›  youwhut

捕捉异常,记录和重新记录-我搞错了吗?

  •  0
  • youwhut  · 技术社区  · 14 年前

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

    2 回复  |  直到 14 年前
        1
  •  6
  •   Community CDub    8 年前

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

    Catch ex As Exception
    LogException (ex)
    Throw
    

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

    如果消费者不是需要公开的.net,这一点非常重要 FaultContracts WCF Web Service Custom Exception Error to Client

        2
  •  1
  •   supercat    14 年前

    在vb.net中,最好的做法是在处理“throw”之前记录(记录)异常。“Catch Ex as WhateverException When someconditionisrue”构造非常强大。请注意,该条件可能会有副作用,并将在堆栈展开之前进行评估。如果计算条件的代码有一个断点,则在异常有机会触发任何最终的。。。子句(这样,在清除代码清除异常之前,可以检查可能导致异常的对象)。此外,如果异常最终无法处理,则会在引发异常的位置和上下文中获取断点。