编写强健的初始化和终止事件

用 Visual Basic 定义的类,不管是类模块、UserControls 还是 UserDocuments,都具有内置的初始化和终止事件。位于初始化事件中的代码将是创建对象时首先被执行的代码。

例如,下面的代码段的第一部分中,SmallMechanicals 部件的 Widget 类在其对象被创建时设置其只读的 Created 属性的值。

'部件的 Widget 类模块代码。
'存储只读 Created 属性。
Private mdatCreated As Date

'实现只读 Created 属性。
Public Property Get Created() As Date
   Created = mdatCreated
End Property

'对象创建时设置只读 Created 属性的值。
Private Sub Class_Initialize()
   mdatCreated = Now
End Sub

'客户端应用程序代码。
Private Sub cmdOK_Click()
   Dim wdgX As New SmallMechanicals.Widget
   '显示对象创建的日期/时间。
   MsgBox wdgX.Created
End Sub

在该代码段的最后部分,客户端创建了一个 Widget 对象。变量 wdgX 包含对该 Widget 对象的引用;该变量被声明为 As New,所以该 Widget 在第一次运行使用 wdgX 的代码时被创建。当执行 MsgBox 函数时,该 Widget 被创建,且首先执行的代码就是其 Class_Initialize 事件过程。当对新建的 Widget 的只读 Created 属性求值时,它的值已经被设置好了,这样 MsgBox 才会正确地显示该对象被创建的时间。

在 Class_Initialize 事件过程中发生的错误被返回到客户端中请求该对象的地点。因此,在该 Widget 的 Class_Initialize 事件过程中添加下述代码行,将在客户端的 MsgBox 语句发生 31013 号错误。

   Err.Raise Number:=31013

在终止事件中处理错误

终止事件是对象存活期中的最后一个事件。可以在 Class_Terminate 事件过程中放置清除代码,这些代码将在对象的最后一个引用被释放时执行,随后该对象被毁坏。包含从属对象的复杂对象在终止事件中应释放对其从属对象的引用。

终止事件中的错误要谨慎处理。因为终止事件不是由客户端应用程序调用,在调用堆栈中其上无其它过程。这就意味着部件在终止事件中一个未处理的错误将导致致命的错误。

重点   对进程内部件而言,这种致命错误就是客户端的致命错误。因为这种部件在客户端的进程中运行,部件的致命错将导致客户端应用程序被终止。