自定义错误

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