概述
大家知道,即使顺序员抱有最好的愿望,而且计划工作做得非常周密,也无法防止代码泛起错误。现实上可能泛起的顺序错误是许多的,但是它们基本上可以分为两种类型:一种是编译错误;另一种是运行期错误。编译错误是指使得Visual Bacsic(下面简称VB)的编译器无法对代码进行编译的错误。假如一个历程中包含了编译错误,VB将不执行该历程,并且我们也不能向用户提供带有编译错误的运行期版本应用顺序,大多数编译错误是句法错误造成的。
1、VB的编译选项
VB有两个设置项会在很大程度上影响我们创建非常坚固的代码的能力。一个设置项是Compile On Demand(按需要进行编译),另一个设置项是Background Compile(后台编译)。可以打开Options对话框,选定General选项卡,然后对这两个设置项进行设置,如下图1所示。当选定Compile On Demand时,假如单击对象栏上的Run按钮,或者按F5键,VB并不齐面编译我们的项目。相反,只在引用历程时,才对这些历程进行编译。使用Compile On Demand,通常可使比较大的项目或者速度较慢的计算机上的项目能够更快地启动运行,但是它也会产生某些不被注意的编译错误。
在发现和纠正所有编译错误之前,不能将项目编译成.exe或.dll之类的可发布文件,因此,选定Compile On Demand并不能够发布带有编译错误的代码。但是,选定Compile On Demand后,会导致编译错误随着时间的推移而不断增加,从而在最后试图进行齐面编译时,迫使我们对代码进行大量的纠错。假如在IDE中调试项目,VB常常必须制止(不只是停息)运行,以便进行纠错操作。这使得调试正在运行的项目时对大量编译错误的纠正操作变得非常麻烦。假如能够在合理的时间内齐面编译项目,那么可以思量关闭Compile On Demand。也可使Compile On Demand保持选定状态,但是要定期按Ctrl+F5键,以便重新运行我们的项目。这使我们在编程时能够定期纠正编译错误,而不必一次性纠正大量的编译错误。
图1 编译时选中Compile On Demand和Background Compile两个选项
2、Err对象
1、使用On Error Resume Next以忽略错误
对错误进行处理的最简单(和最危险)的方法是使用On Error Resume Next语句。On Error Resume Next语句规定,代码中的错误将完齐被忽略,存在错误的代码行被跳过,然后继续执行下一个语句。例如,下面这个历程存在一个运行期错误(即一个被0除的错误),它由On Error Resume Next错误处理顺17173序来处理:
属性
|
说明
|
Number | 用于标识该错误的公用号码 |
Source | 当前VB项目的名字 |
Description | 表义性的错误动静。假如某个错误没有这个字符串,本属性就会指明"应用顺序定义的错误或对象定义的错误" |
HelpFile | 与错误相关的VB 帮助文件所在的驱动器、路径和文件名 |
HelpContext | VB 帮助文件用于该错误的上下文ID |
LastDLLError | 在32位Microsoft Windows操作系统上,上次调用动态链接库(DLL)的系统错误代码。LastDllError属性是只读属性 |
三、错误处理顺序的类型
将一个项目看成已经编译的顺序运行时,未捕获的错误解造成致命的后果,它们会导致顺序终止运行。必须尽一切尽力防止发生这种情况。若要防止代码中的错误中断代码的运行(并终止已编译顺序的运行),我们可以创建错误处理顺序以捕获代码中的错误。当捕获一个错误后,VB并不表现犯错动静,也不终止代码的运行。相反,我们编写的专门用来处理错误的代码则开始运行。每个历程都应该拥有错误处理顺序,而不管它包含多大的代码量。最好在代码中放入一个On Error语句,作为代码的第一行,放在紧靠历程题目的后面和变量说明的前面。假如一个历程的错误能够以这种体例泛起,就应该在历程的开头用凸起的注释来明确说明这一行为特性。
若要捕获错误,基本上可使用下面两种方法:
当泛起错误时,使用On Error GoTo,转移到别的代码上往执行。
使用On Error Resume Next语句,不中断代码的执行,也不转移到别的代码上往执行,而是忽略该错误。
可以在一个历程中创建多个错误处理顺序,但每次只能激活一个错误处理顺序。VB将最新的On Error语句中指明的处理顺序视为已经激活的错误处理顺序。切换一个历程中的不同位置上的错误处理顺序,往往是很有好处的,理解各个错误处理顺序如何运行,是利用这一功能的关键。
在能够编写有效的错误处理代码之前,我们必须了解VB的Err对象,这是个运行期对象,它包含了关于最新错误的信息。当顺序运行时遇到一个错误,或者当我们使用Err对象的Raise方法故意引发一个错误时,便形成Err对象的属性。当遇到On Error语句(比如On Error Resume Next),并且在使用Exit Sub、Exit Function或Exit Property语句退出一个历程后,Error对象的属性值就被清除。若要显式清除Err对象,可以调用它的Clear方法。下表1列出了Err对象的属性。
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() 3、用调试体例激活错误处理顺序和打消其激活状态 |
我们可能认为,被0除的错误解导致代码在输出文本line 4这个语句上继续执行,因为这是代码的第四个语句(不是计数注释)。不仅这种情况不会发生,而且该代码现实上会导致产生一个编译错误,并且代码根本不会执行。
最后
以上就是温暖小伙为你收集整理的VB程序错误处理方法的全部内容,希望文章能够帮你解决VB程序错误处理方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复