自定义错误
通常在编写专门的类时,你会希望它提出自己的特定错误,并且你需要一种干净的方式来处理这些自定义错误的用户/调用代码。实现这一目标的一种巧妙方法是定义专用的 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
使用,但它已经过时/弃用了。