通常,在编写专门的类时,您会希望它引发自己的特定错误,并且希望为用户/调用代码提供一种干净的方法来处理这些自定义错误。实现此目的的一种好方法是定义一个专用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,但已过时/不建议使用。