自定義錯誤
通常在編寫專門的類時,你會希望它提出自己的特定錯誤,並且你需要一種乾淨的方式來處理這些自定義錯誤的使用者/呼叫程式碼。實現這一目標的一種巧妙方法是定義專用的 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
方法也可以採用自定義 Description
和 Source
引數 - 因此最好定義常量來儲存每個自定義錯誤的描述:
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
使用,但它已經過時/棄用了。