由部件生成错误的指南

使用 Err 对象的 Raise 方法生成可被客户应用程序捕获的错误。如果在方法或 Property 过程的错误处理中调用了 Raise 方法,或者错误处理例程被关闭 (On Error GoTo 0),那么错误会出现在客户应用程序中直接调用该方法的过程中。

如果调用方法的过程没有错误处理程序,错误状态将沿着客户应用程序的调用关系向上,直到有错误处理程序的过程为止,其它错误也是这样。

由部件生成错误条件时,不必关心客户应用程序是用 Visual Basic、Microsoft Visual C++、还是其它编程语言编写的。任何客户应用程序都可以接收部件生成的错误。

下面是由部件生成错误时应该遵循的一些原则。

例如,把 Widget 对象的 SpinDirection 属性作为 Property 过程来实现,以确保它只接收某些值。参见下面假想的 SmallMechanicals 部件 Widget 类模块中的代码段。

'枚举 SpinDirection 属性的值。
'   (前缀“sm”表示它属于
'   SmallMechanicals 部件。)
Public Enum smSpinDirection
   smSDClockwise
   smSDCounterClockwise
End Enum

'SpinDirection 属性的模块级存储。
Private msdSpinDirection As smSpinDirection

'SpinDirection 属性的实现。
Property Get SpinDirection() As smSpinDirection
   SpinDirection = msdSpinDirection
End Property

Property Let SpinDirection(ByVal sdNew As _
      smSpinDirection)
   '如果 spdNew 包含的值有效,那么 
   'Select Case 不做任何事情。
   Select Case sdNew
      Case smSDClockwise
      Case smSDCounterClockwise
      Case Else
         Err.Raise _
            (ERR_SPN_INVALID + vbObjectError), _
            CMP_SOURCENAME, _
            LoadResString(ERR_SPN_INVALID)
   End Select
   '如果没有错误,那么设置新的属性值。
   msdSpinDirection = sdNew
End Property

上面的代码假定 ERR_SPN_INVALIDCMP_SOURCENAME 是在标准模块中声明的公共常量,同时错误文本字符串存储在资源文件中。

由于设置 SpinDirection 属性值的“Property Let”过程无错误处理程序,因此在客户应用程序中试图设置无效值的过程会产生错误。

错误消息文本字符串从部件工程的资源文件中载入,使用内部的错误号作为索引。这种方案节约了运行部件所需内存。把所有文本字符串集中在一起还可以简化创建部件国际版本的过程。

注意 使用 C++ 语言编程者知道 vbObjectError 是设备接口 (FACILITY_ITF),即部件接口保留的错误范围的基本常量。

详细信息 “处理部件中的错误”讨论内部错误的处理,尤其是正在被部件使用的部件所产生的错误。关于 Err 对象和资源文件的详细信息请参阅《联机手册》中的《语言参考》的“Err 对象”以及索引中的“资源文件”。

在多语种环境下提供错误消息将在本章稍后的“本地化部件”和《Visual Basic 程序员指南》的“国际化”中讨论。