如何处理错误

就理想的情况而言,Visual Basic 过程根本不需要错误处理代码。但实际上情况却是这样的,硬件出现的问题或用户出乎意料的操作都会造成运行时错误,这些错误会使代码终止,而且通常无法恢复应用程序的运行。其它错误也许不会中断代码,但是这些错误可能使代码产生意想不到的操作。

例如,如果指定文件存在,则以下过程返回真,否则返回假,但该过程不包含错误处理代码:

Function FileExists (filename) As Boolean
   FileExists = (Dir(filename) <> "")
End Function

Dir 函数返回与指定的文件名(带有统配符或无统配符、有驱动器名或路径)相匹配的第一个文件,如果相匹配的文件不存在,则 Dir 函数返回零长度字符串。

代码似乎适用于两种 Dir 调用的可能结果的任何一种。但是,如果参数中指定的驱动器号是无效驱动器,则产生“装置不可用”的错误。如果指定的驱动器是软盘驱动器,则只有在驱动器内有磁盘且驱动器门关闭时,Dir 函数才能正确工作。否则,Visual Basic 显示“磁盘未准备”的错误并终止代码的执行。

为避免这种情况,在 Visual Basic 中可用错误处理功能中断错误并执行正确操作。(截击错误亦称作捕获错误。)当错误发生时,Visual Basic 将设置错误对象 Err 的各种属性,如错误号、描述等。这样,在错误处理例程中就能使用 Err 对象及其属性,以便应用程序可智能化地对错误状况作出响应。

例如,可用以下代码处理无效驱动器或空软盘驱动器等诸如此类的装置问题:

Function FileExists (filename) As Boolean
   Dim Msg As String
   '如果检测到任何一个错误,则开始捕获错误,从而响应错误处理程序。
   On Error GoTo CheckError   
      FileExists = (Dir(filename) <> "")
      '如果未出现错误,则避免使用错误处理程序。
      Exit Function

CheckError:               '如果出现错误,则在此分枝。
   '定义常数以表示固定的 Visual Basic 错误代码。
   Const mnErrDiskNotReady = 71, _
   mnErrDeviceUnavailable = 68
   ' vbExclamationvbOKvbCancelvbCritical  vbOKCancel '定义在 VBA 类型库中的常数。
   If (Err.Number = MnErrDiskNotReady) Then
      Msg = "Put a floppy disk in the drive " 
      Msg = Msg & "and close the door."
      '显示具有感叹号图标以及“确定”和“取消”按钮的消息框。
      If MsgBox(Msg, vbExclamation & vbOKCancel) = _
      vbOK Then
         Resume
      Else
         Resume Next
      End If
   ElseIf Err.Number = MnErrDeviceUnavailable Then
      Msg = "This drive or path does not exist: "
      Msg = Msg & filename
      MsgBox Msg, vbExclamation
      Resume Next
   Else
      Msg = "Unexpected error #" & Str(Err.Number)
      Msg = Msg & " occurred: " & Err.Description
      ' 用“Stop”信号灯图标和“确定”按钮显示消息框。
      MsgBox Msg, vbCritical
      Stop
   End If
   Resume
End Function

在代码中,Err 对象的 Number 属性包含错误号,它与运行时错误相关联,Err 对象的 Description 属性包含错误的简短描述。

当 Visual Basic 生成“磁盘未准备”的错误时,代码显示一段信息,通知用户选择两个按钮之一-“确定”或“取消”。如果选择“确定”,则 Resume 语句将控件返回到出错的语句处,并重新执行该语句。如果错误已得到改正,则操作获得成功;否则程序返回到错误处理程序。

如果选择“取消”,则 Resume Next 语句将控件返回到出错语句(此时为 Exit Function 语句)之后的那条语句。

即使出现“装置不可用”的错误,代码也显示对问题进行描述的信息。于是,由于使用 Resume Next 语句,函数将在出错语句之后的那条语句处继续执行。

如果出现意想不到的错误,则将显示一段简短描述错误的说明并在 Stop 语句处终止代码。

已建立的应用程序可修正错误,或提示用户修改造成错误的条件。为此可使用象上例中展示的那些技术。下一节将详细讨论这些技术。

详细信息 关于如何使用 Stop 语句,请参阅本章后面“错误处理的分层结构”中的“复杂错误处理指南”所作的解释。