VBA 自定义错误

示例

通常,在编写专门的类时,您会希望它引发自己的特定错误,并且希望为用户/调用代码提供一种干净的方法来处理这些自定义错误。实现此目的的一种好方法是定义一个专用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 = "foo没有被禁止。"
Private Const Msg_BarNotInitialized As String = "该栏未初始化。"

然后创建一个专用的私有方法来引发每个错误:

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

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

然后,该类的实现可以简单地调用以下专用过程来引发错误:

Public Sub DoSomething()
    'raises the custom 'BarNotInitialized' error with "DoSomething" as the source:
    IfMe.BarIs Nothing Then OnBarNotInitializedError "DoSomething"
    '...
End Sub

然后,客户端代码可以Err_BarNotInitialized在其自己的错误处理子例程中处理任何其他错误。


注意:Error也可以使用legacy关键字代替Err.Raise,但已过时/不建议使用。