2014-02-20 41 views
0

我有一個我正在寫的基本上將用於發送交易到信用卡處理器的類。錯誤處理:引發事件或手動拋出異常

作爲一種保障措施,我會做一些檢查來驗證傳遞給函數的屬性,我的問題是如果我檢測到錯誤,說空白或無效的信用卡號碼,我應該提出一個自定義事件並強制任何正在調用該函數來處理自定義事件以處理異常,或者我應該新建一個異常,並且假定無論調用我的類將有它自己的try和catch來處理異常嗎?

我很好奇哪個更有效率,但更關心手動使用throw關鍵字的公認標準。

回答

2

無法強制呼叫者註冊事件,因此如果您通過事件處理此事件,消費者有可能會忽略該問題。如果它應該是阻塞問題,請使用例外。

從效率的角度來看,拋出(更具體地說是捕獲)異常會產生開銷,但是如果您處於無法發生任何事情的情況,那麼確實是一個例外情況。另外,考慮在開發過程中包含Trace.Assert以協助調試。

1

最好的辦法是引發異常。這將迫使程序不得不明確地處理這個問題,而不是依靠開發人員來註冊處理程序。

異常還意味着您可以處理更接近可處理它的代碼的錯誤。例如,您的事務處理器可能深藏在調用堆棧中,但它實際上是您的GUI層,而不是通過顯示消息來處理錯誤。使用事件方法,您將無法將您的gui附加到事務處理器,因爲它無法訪問它,但通過例外方法,您可以處理其錯誤。

0

如果驗證失敗,這不是一個「事件」。

我會建議您做到以下幾點:

1 - 添加一個方法,一個名爲像ValidateDetails

2布爾返回 - 如果驗證失敗,拋出一個異常,當您試圖處理信息(你可以使用ValidateDetails方法來檢查它)

這將允許開發人員在發送它進行處理和接收異常之前執行他們自己的檢查,他們提供了正確的信息。

Public Class CreditCardProcessor 
    Public Function ValidateDetails As Boolean 
     'check everything validates here and return True/False accoringly 
    End Function 

    Public Sub ProcessDetails 
     If Not ValidateDetails Then 
      Throw New Exception("Validation failed") 
      Exit sub 
     End If 
     'Process the credit card here 
    End Sub 
End Class 
相關問題