VB程序错误处理方法小结 点击:1933 | 回复:3



小麻籽

    
  • 精华:23帖
  • 求助:0帖
  • 帖子:413帖 | 2345回
  • 年度积分:0
  • 历史总积分:12877
  • 注册:2007年5月03日
发表于:2008-05-12 22:03:13
楼主

众所周知,即使程序员抱有最好的愿望,而且计划工作做得非常周密,也无法避免代码出现错误。实际上可能出现的程序错误是很多的,但是它们基本上可以分为两种类型:一种是编译错误;另一种是运行期错误。

编译错误是指使得Visual Bacsic(下面简称VB)的编译器无法对代码进行编译的错误。如果一个过程中包含了编译错误,VB将不执行该过程,并且我们也不能向用户提供带有编译错误的运行期版本应用程序,大多数编译错误是句法错误造成的。

在能够编写有效的错误处理代码之前,我们必须了解VB的Err对象,这是个运行期对象,它包含了关于最新错误的信息。当程序运行时遇到一个错误,或者当我们使用Err对象的Raise方法故意引发一个错误时,便形成Err对象的属性。当遇到On Error语句(比如On Error Resume Next),并且在使用Exit Sub、Exit Function或Exit Property语句退出一个过程后,Error对象的属性值就被清除。若要显式清除Err对象,可以调用它的Clear方法。下表1列出了Err对象的属性。
属性
说明

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语句中指明的处理程序视为已经激活的错误处理程序。切换一个过程中的不同位置上的错误处理程序,往往是很有好处的,理解各个错误处理程序如何运行,是利用这一功能的关键。
  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这个语句上继续执行,因为这是代码的第四个语句(不是计数注释)。不仅这种情况不会发生,而且该代码实际上会导致产生一个编译错误,并且代码根本不会执行。




up-date

  • 精华:0帖
  • 求助:0帖
  • 帖子:16帖 | 156回
  • 年度积分:0
  • 历史总积分:1361
  • 注册:2004年10月28日
发表于:2008-05-14 09:02:29
1楼

学习了

 

学习了

吴伙运

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 26回
  • 年度积分:0
  • 历史总积分:131
  • 注册:2004年10月12日
发表于:2008-05-16 00:42:37
2楼
我处理VB错误的方法是这样的,先考虑一些极为可能的出错,用err.number查出具体内容,再每一种出错给出一种处理方法,其他的错误再用通用的处理方法,但无论哪一样出错,最终目的是当出错后,要使程序能自动恢复正常运行.特别是实时系统,自动恢复很重要.

andy fau

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 262回
  • 年度积分:0
  • 历史总积分:604
  • 注册:2006年3月21日
发表于:2008-06-06 19:10:24
3楼

我也是根据error number来处理问题呢


热门招聘
相关主题

官方公众号

智造工程师