VB==容错处理策略

本文将详细地讨论在Visual Basic中处理错误发生的On Error命令家族,它们的任务就是安装错误代理并解决错误的发生,并解释错误代码的含义。阅读完本文后,你将能编写基本的错误代理程序,有效地防止以外错误。作者:甘冀平2000-11-03

   本文包括以下几节内容:

  • 使用On Error语句
  • 如何离开错误处理程序
  • 定义错误常数
  • 将错误处理程序单独存放
  • 理解错误处理的范围
  • 不要嵌套使用错误处理程序
   使用On Error语句

   Visual Basic程序使用On Error命令来登记错误处理程序,它有下面3种形式:

  • On Error GoTo 0
  • On Error Resume Next
  • On Error GoTo line

   These 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 0

   On 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
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值