使用 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_INVALID
和 CMP_SOURCENAME
是在标准模块中声明的公共常量,同时错误文本字符串存储在资源文件中。
由于设置 SpinDirection 属性值的“Property Let”过程无错误处理程序,因此在客户应用程序中试图设置无效值的过程会产生错误。
错误消息文本字符串从部件工程的资源文件中载入,使用内部的错误号作为索引。这种方案节约了运行部件所需内存。把所有文本字符串集中在一起还可以简化创建部件国际版本的过程。
注意 使用 C++ 语言编程者知道 vbObjectError 是设备接口 (FACILITY_ITF),即部件接口保留的错误范围的基本常量。
详细信息 “处理部件中的错误”讨论内部错误的处理,尤其是正在被部件使用的部件所产生的错误。关于 Err 对象和资源文件的详细信息请参阅《联机手册》中的《语言参考》的“Err 对象”以及索引中的“资源文件”。
在多语种环境下提供错误消息将在本章稍后的“本地化部件”和《Visual Basic 程序员指南》的“国际化”中讨论。