联机错误处理

您也许习惯于使用语言编程,换言之,当错误发生时,产生例外情况也不会中断代码的执行,而是将错误记录下来以供今后查对。C 编程语言就是以这种方式工作的,有时会发现,在 Visual Basic 代码中遵循这种习惯是很方便的。

直接在每个可能导致错误的行之后检查错误时,要执行联机错误处理。该主题解释联机错误处理的不同方法,其中有:

返回错误号

有许多返回错误号的方法。如果错误发生,最简单的方法就是创建返回错误号而不是值的函数和语句。下例说明在 FileExists 函数示例中如何使用这种方法,该实例说明具体文件是否存在。

Function FileExists (p As String) As Long
   If Dir (p) <> " " Then
      FileExists = conSuccess   ' 返回表示文件存在的常数。
   Else
      FileExists = conFailure   ' 返回表示失败的常数。
   End If
End Function

Dim ResultValue As Long
ResultValue = FileExists ("C:\Testfile.txt")
If ResultValue = conFailure Then
   .
   .   '处理错误。
   .
Else
   .
   .   '执行程序。
   .
End If

联机错误处理的关键是直接在每一个语句或函数调用后测试错误。用这种方式,可以设计一个处理程序,准确预测可能产生的错误种类,从而解决它。这种方法不需要产生实际的运行时错误。这对以 API 和其它 DLL 过程工作的过程是有用的,它们不会使 Visual Basic 产生例外情况。相反,这些过程或者在返回值中,或者在过程传递的参数中指出错误条件;检查正在使用的过程的文档,以确定这些过程如何指示错误条件。

在调用过程中处理错误

另一种指出错误条件的方法是在过程本身引起 Visual Basic 的错误,并在调用过程中处理联机错误处理程序中的错误。下例所示为相同的 FileExists 过程,如果这个过程不成功,则产生错误号。在调用这个函数前,On Error Resume Next 语句在错误发生时设置 Err 对象属性的值,但并不执行错误处理例程。

错误处理代码在 On Error Resume Next 语句之后。该代码能检查 Err 对象的属性以观察是否出现错误。如果 Err.Number 不包含零,则错误已发生,而且,错误处理代码可根据 Err 对象属性的值采用适当的操作。

Function FileExists (p As String)
   If Dir (p) <> " " Then
      Err.Raise conSuccess   ' 返回表示文件存在的常数。
   Else
      Err.Raise conFailure   ' 产生错误号 conFailureEnd If
End Function

Dim ResultValue As Long
On Error Resume Next
ResultValue = FileExists ("C:\Testfile.txt")
If Err.Number = conFailure Then
   .
   .   '处理错误。
   .
Else
   .
   .   '继续程序。
   .
End If

下例用返回值和其中的一个传递参数指出错误的条件是否由函数的调用造成的。

Function Power (X As Long, P As Integer, _
ByRef Result As Integer)As Long
   On Error GoTo ErrorHandler
   Result = x^P
   Exit Function
ErrorHandler:
   Power = conFailure
End Function

'调用 Power 函数。
Dim lngReturnValue As Long, lngErrorMaybe As Long
lngErrorMaybe = Power (10, 2, lngReturnValue)
If lngErrorMaybe Then
   .
   .   '处理错误。
   .
Else
   .
   .   '继续程序。
   .
End If

如果所写的函数直接返回结果值或错误代码,则结果值可能在错误代码的范围内,而调用的过程也许无法区分它们。如果即使用返回值又使用其中的一个传递参数,则程序能确定函数调用失败的原因并采用适当的操作。

使用变量数据类型

另一个返回嵌入错误信息的方法是利用 Visual Basic Variant 数据类型和某些相关函数。Variant 有一个标记,指出包含在变量中的数据类型,并且能将其标记成 Visual Basic 错误代码。可编写一个返回 Variant 的函数,并用这个标记指示调用已出现错误的过程。

下例说明如何编写 Power 函数以返回 Variant。

Function Power (X As Long, P As Integer) As Variant
   On Error GoTo ErrorHandler
   Power = x^P
   Exit Function

ErrorHandler:
   Power = CVErr(Err.Number)   '将错误代码转换成已标记的变体型。
End Function

'调用 Power 函数。
Dim varReturnValue As Variant
varReturnValue = Power (10, 2)
If IsError (varReturnValue) Then
   .
   .   '处理错误。
   .
Else
   .
   .   '继续程序。
   .
End If