自定義錯誤

通常在編寫專門的類時,你會希望它提出自己的特定錯誤,並且你需要一種乾淨的方式來處理這些自定義錯誤的使用者/呼叫程式碼。實現這一目標的一種巧妙方法是定義專用的 Enum 型別:

Option Explicit
Public Enum FoobarError
    Err_FooWasNotBarred = vbObjectError + 1024
    Err_BarNotInitialized
    Err_SomethingElseHappened
End Enum

使用 vbObjectError 內建常量可確保自定義錯誤程式碼不與保留/現有錯誤程式碼重疊。只需要明確指定第一個列舉值,因為每個 Enum 成員的基礎值大於前一個成員的 1,因此 Err_BarNotInitialized 的基礎值隱含地為 vbObjectError + 1025

提出自己的執行時錯誤

使用 Err.Raise 語句可以引發執行時錯誤,因此可以按如下方式引發自定義 Err_FooWasNotBarred 錯誤:

Err.Raise Err_FooWasNotBarred

Err.Raise 方法也可以採用自定義 DescriptionSource 引數 - 因此最好定義常量來儲存每個自定義錯誤的描述:

Private Const Msg_FooWasNotBarred As String = "The foo was not barred."
Private Const Msg_BarNotInitialized As String = "The bar was not initialized."

然後建立一個專用的私有方法來引發每個錯誤:

Private Sub OnFooWasNotBarredError(ByVal source As String)
    Err.Raise Err_FooWasNotBarred, source, Msg_FooWasNotBarred
End Sub

Private Sub OnBarNotInitializedError(ByVal source As String)
    Err.Raise Err_BarNotInitialized, source, Msg_BarNotInitialized
End Sub

然後,類的實現可以簡單地呼叫這些專門的過程來引發錯誤:

Public Sub DoSomething()
    'raises the custom 'BarNotInitialized' error with "DoSomething" as the source:
    If Me.Bar Is Nothing Then OnBarNotInitializedError "DoSomething"
    '...
End Sub

然後,客戶端程式碼可以在其自己的錯誤處理子例程中處理 Err_BarNotInitialized,就像處理任何其他錯誤一樣。

注意:傳統的 Error 關鍵字也可以代替 Err.Raise 使用,但它已經過時/棄用了。