若要防止代码中的错误中断代码的运行(并终止已编译程序的运行),我们可以创建错误处理程序以捕获代码中的错误。当捕获一个错误后,VB并不显示出错消息,也不终止代码的运行。相反,我们编写的专门用来处理错误的代码则开始运行。每个过程都应该拥有错误处理程序,而不管它包含多大的代码量。最好在代码中放入一个On Error语句,作为代码的第一行,放在紧靠过程标题的后面和变量说明的前面。如果一个过程的错误能够以这种方式出现,就应该在过程的开头用突出的注释来明确说明这一行为特性。
若要捕获错误,基本上可以使用下面两种方法:
当出现错误时,使用On Error GoTo,转移到别的代码上去执行。
使用On Error Resume Next语句,不中断代码的执行,也不转移到别的代码上去执行,而是忽略该错误。
可以在一个过程中创建多个错误处理程序,但每次只能激活一个错误处理程序。VB将最新的On Error语句中指明的处理程序视为已经激活的错误处理程序。切换一个过程中的不同位置上的错误处理程序,往往是很有好处的,理解各个错误处理程序如何运行,是利用这一功能的关键。
1、使用On Error Resume Next以忽略错误
对错误进行处理的最简单(和最危险)的方法是使用On Error Resume Next语句。On Error Resume Next语句规定,代码中的错误将完全被忽略,存在错误的代码行被跳过,然后继续执行下一个语句。例如,下面这个过程存在一个运行期错误(即一个被0除的错误),它由On Error Resume Next错误处理程序来处理:
Private Sub cmdGenerateError_Click()
'* Purpose: Test On Error Resume Next
On Error Resume Next
Debug.Print 10 / 0
End Sub
Debug.print语句产生了一个被0除的错误。但是,由于存在一个已经激活的错误处理程序(由On Error Resume Next指定),因此该错误被忽略,并在下一个语句(即End Sub语句)上恢复执行。错误被忽略并不意味着我们无法知道错误已经发生。当一个语句产生了一个错误之后,尽管没有显示出错消息,Err对象仍然包含关于该错误的信息。
2、使用On Error GoTo转移执行的代码流
除非我们捕获了一个意料之外的错误,比如上面代码中的那种错误,否则忽略代码中的错误是非常危险的,并且是一种不得已时采用的办法。当一个过程中出现了意料之外的错误时,该过程就会产生许多问题。如果忽略该错误,就会对用户产生严重的影响,比如数据没有保存,或者保存不正确。许多情况下,当出现代码错误时,必须执行某些操作,将代码的执行转移到On Error GoTo语句中指定的错误处理程序。该语句的句法如下:
On Error GoTo line
请注意,line必须是指与On Error GoTo语句相同的过程中的一个语句。
在这个句法中, line有两个意思。首先它是指出现错误时要转移到的这个代码行号。不过这个行号并不是过程中的代码行的物理位置。请看下面这个代码例子:
Private Sub TestErrorHandler()
'* Purpose : Test the On Error GoTo statement by deliberately
'* generating a run-timeerror.
On Error GoTo 4
Debug.Print "Line 2"
Debug.Print 10 / 0
Debug.Print "Line 4"
Debug.Print "Line 5"
End Sub
我们可能认为,被0除的错误会导致代码在输出文本line 4这个语句上继续执行,因为这是代码的第四个语句(不是计数注释)。不仅这种情况不会发生,而且该代码实际上会导致产生一个编译错误,并且代码根本不会执行。