本文包括以下几节内容:
使用On Error语句 如何离开错误处理程序 定义错误常数 将错误处理程序单独存放 理解错误处理的范围 不要嵌套使用错误处理程序 使用On Error语句Visual Basic程序使用On Error命令来登记错误处理程序,它有下面3种形式:
On Error GoTo 0 On Error Resume Next On Error GoTo lineThese forms tell Visual Basic what it should do when the program encounters an error. The three forms are described in the following sections.
这些代码告诉Visual Basic程序当遇到错误时应该做什么。下面详细介绍这3种语句。
On Error GoTo 0
On Error GoTo 0比较直接,它仅仅中止任何当前安装的错误处理代理(比如在前面安装的On Error GoTo line或者On Error Resume Next语句)。如果程序在其后遇到错误,那么就会崩溃。
On Error Resume Next
这种方法使程序忽视发生的错误,当遇到一个错误时,程序继续在其后执行。如果程序使用了On Error Resume Next命令,那么就应该在每次可能产生错误的操作后面检查一下Err对象的数值。如果Err.Number不为零,就表明操作产生了错误,程序可以对此采取特殊的动作。注意:在可能发生问题的语句后,程序应该立即检查Err.Number的数值,因为,其他的错误操作将复位Err对象并清除前面的错误信息。
许多开发人员在给用户一个通用对话框后使用On Error Resume Next命令。 CommandDialog控件的CancelError属性指明了当用户Cancel对话框时是否产生一个错误。下面的代码段显示了程序如何使用CancelError判断是否继续一个操作,比如装入一个文件。
如果用户选择了cancel,就产生一个错误dlgOpenFile.CancelError = True 忽视错误的发生On Error Resume Next 显示对话框dlgOpenFile.ShowOpen 判断是否有错误If Err.Number = cdlCancel Then 如果是用户canceled,就什么也执行 Exit SubElseIf Err.Number <> 0 Then 如果是未知错误,就采取另外的行为 :End If 恢复正常的错误处理On Error GoTo 0On Error GoTo Line
使用这个方法,将登记一个新的错误处理代理。如果程序遇到错误,控制将转移到定义的程序行,然后再执行特殊的处理。
请看下面的代码:
Private Sub DoSomething() 安装错误处理代理 On Error GoTo UnexpectedError 日常操作 : 使程序不进入下面的错误处理代理程序 Exit SubUnexpectedError: 将错误信息描述给用户 MsgBox Unexpected error & _ Str$(Err.Number) & _ in subroutine DoSomething. & _ vbCrLf & _ Err.Description Exit SubEnd Sub
如何离开错误处理程序
有下面几种方法可以使程序离开错误处理代理程序的控制,然后返回到正常的执行代码处:
Resume Resume Next Exit Sub/Function/Property End Sub/Function/Property Err.Raise 下面对它们进行详细地描述。Resume
执行Resume语句后,将重复执行发生错误的那条命令。如果那条命令仍然不正确,程序将再次发生错误,这将使程序进入一个不停的循环操作中。为了避免这种循环发生,一般不要使用Resume命令,除非在错误处理代理程序中能对错误进行修复。
例如,下面的代码试图装入一个可能存储在软盘上地文件。如果失败,将报告错误,询问用户是否再试一试。如果磁盘不在软驱中,用户可以将之插入然后点击Retry按钮。这里的程序就是使用了Resume命令实现再次打开文件。当程序又一次失败时,就会再次转到错误处理代理程序中,给用户再次修正错误的机会。最终,直到用户修正了错误,或者点击了Cancel按钮。如果点击了Cancel按钮,程序退出,没有打开文件。
Private Sub LoadData(ByVal filename As String)Dim fnum As Integer 打开文件 fnum = FreeFile On Error GoTo OpenError Open filename For Input As fnum 读取数据 On Error GoTo ReadError : 关闭文件 On Error GoTo CloseError Close fnum Exit SubOpenError: ’打开文件失败,询问用户是否再次打开 If MsgBox(Error & _ Str$(Err.Number) & _ opening file & filename & . & _ vbCrLf & Err.Description & vbCrLf & _ Check that the disk is properly & _ inserted and click the Retry button., _ vbRetryCancel, _ Error opening file) = vbRetry _ Then 再次打开文件 Resume End If ’否则,选择Cancel退出这个过程 Exit SubReadError: MsgBox Error & _ Str$(Err.Number) & _ reading file & filename & . & _ vbCrLf & Err.Description 关闭文件 Close fnum Exit SubCloseError: 关闭文件发生错误 MsgBox Error & _ Str$(Err.Number) & _ closing file & filename & . & _ vbCrLf & Err.Description Exit SubEnd Sub
Resume Next
执行Resume Next命令使程序在发生错误那条命令后继续执行,这对于程序和用户不能合理地修正错误时很有意义,但同时程序可能执行不完整。
比如,下面的代码使用CDate函数转换一个字符串为日期格式,如果失败了,错误处理代理程序就分配给start_date变量的值为当前的日期:
Private Sub ValidateStartDate(ByVal date_string As String)Dim start_date As Date 安装错误处理代理 On Error GoTo InvalidDate 转换字符串为日期格式 start_date = CDate(date_string) 执行关于这个日期的一些操作 : 不进入下面的错误处理代理程序中 Exit SubInvalidDate: 如果日期非法,就使用当前日期 start_date = Date Resume NextEnd Sub请注意,尽量不要使用这种方法处理错误,因为它采取了“安静”的方式,而不是明显地告诉用户发生了错误。应该是这样,当用户输入了非法日期后,就提示他发生了错误,并要求输入一个新的数值。
Exit Sub/Function/Property
如果程序不能继续它的任务,可以立即使用 Exit Sub、 Exit Function 或者 Exit Property 实现退出。下面的代码是上面那段程序的一个新版本,如果日期字符串非法,就告诉给用户,然后退出程序:
Private Sub ValidateStartDate(ByVal date_string As String)Dim start_date As Date 安装错误处理代理 On Error GoTo InvalidDate 转换字符串为日期 start_date = CDate(date_string) 执行关于这个日期的一些操作 : 不进入下面的错误处理代理程序中 Exit SubInvalidDate: 如果日期非法,就告诉用户,然后退出 MsgBox The start date & _ date_string & _ is invalid. Please enter a new one. Exit SubEnd Sub