设为首页收藏本站

SKY外语、计算机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2175|回复: 0
打印 上一主题 下一主题

vb中错误的处理方法

[复制链接]

60

主题

8

好友

1161

积分

金牌会员

Rank: 6Rank: 6

生肖
星座
处女座
性别

最佳新人 活跃会员 灌水之王 论坛元老

跳转到指定楼层
楼主
发表于 2012-5-14 20:16:08 |只看该作者 |倒序浏览
本帖最后由 sky_yx 于 2015-12-30 14:22 编辑

一、问题的提出
我们在编程过程中难免出现一些这样或那样的的错误 ,使程序不能运行或是得不到正确的结果,所以我们要了解错误出现的原因并学会避免它。让我们来分析一下错误类型和产生错误的原因:
语法错:在输入的语句不正确时发生。例如:关键字拼写错误、标点符号的缺失或者变量名拼写错误。
例如:在使用If语句时没有相应的End If进行匹配将导致一个语法错。Visual Basic会在进行到下一条语句之前对语法错给出提示。
运行错:在一个命令企图执行一个无效的动作时发生。例如:在企图把一个字符串赋值给一个数字类型的变量时发生运行错。在运行错发生时会激活错误处理程序。
逻辑错:在程序既没有语法错也没有运行错的情况下执行程序得到的结果却不是正确的结果时,我们说发生了逻辑错。例如:应用程序要求用户提供口令,可是口令是正确的时候却不能进入应用程序,这时就说发生了逻辑错。
二、解决的方法
在这里我们主要说明一下运行错的解决方法。当一个程序运行出错时,vb提供了缺省的错误处理可以提供给用户出现错误的编号和对错误的一段简短描述并自动终止应用程序。
举例来说,如果把一个很大的计算结果保存到一个整型变量中,会导致溢出的运行错。Visual Basic会给出下图所示的出错编号为6,原因为“溢出”的对话框。 由于Visual Basic不支持集中错误处理技术。每一个过程或事件都要求有一个错误处理程序来解决一个它自己的错误,所以我们必须自己编写错误处理程序。
创建一个错误处理程序的三个基本步骤:
激活一个错误处理程序
编写对可能发生的错误进行处理的代码
继续程序的运行
下面具体介绍一下详细步骤:
通过激活错误处理程序来对运行错进行处理。在过程中使用On Error GoTo语句加一个命名的标号来激活错误处理程序。标号是用来指出错误发生时程序转向错误处理程序的入口。(Identifies a point in code to which the execution will branch when an error is encountered)。这部分代码称为"错误处理程序",命名和变量的命名一样,可以以冒号结尾。放在过程的Exit Sub语句之后。 下面的程序是DataErr错误处理程序实现对数据溢出错误的处理:
Private Sub Command1-Click()
    On Error GoTo DataErr
    Dim num As Integer, var As Integer    num=10
    var = num * 10000
    Print var
    Exit Sub
    DataErr:
MsgBox “Try multiplying with a smaller integer”
End Sub
三、使用Err对象
看过这个例子之后让我们来看看咋样使用Err对象:
Err对象能报告包含和运行错相关的错误信息。可以帮助确定发生的错误类型、原因和错误发生的地方。Err的属性是由错误发生者设置的。错误可能是由Visual Basic或是编程者产生的。在运行错发生时,运行错的属性就被设置为能唯一标志这个错误的信息以及要求的处理。
1、Err对象的属性
Number属性
返回或设置标识错误的编号。它是Err对象的缺省属性。它可以用来确定是哪一个错误发生了,它的值是错误的唯一标识。
语法格式:Object.Number
Description 属性
返回或设置用来对错误进行描述的字符串。
语法格式:Object.Description
Source属性
返回或设置产生错误的应用程序的名字的字符串。当一个意外错误发生时,这个值被自动设置。
语法格式:Object.Source
返回或设置一个包含指向帮助文件所在位置的路径的字符串。
语法格式:Object.HelpFile
HelpContext属性
返回或设置包含帮助文件中有关主题的上下文ID的字符串。
语法格式:Object.HelpContext
用Resume语句来实现继续运行程序。
三种Resume语句:
Resume语句
程序从产生错误的语句开始接着运行。
Resume Next语句
程序从产生错误的语句的下一条语句接着运行。
Resume line语句
从Resume line语句后指定的标号或是行号处开始运行程序,注意标号或是行号指定的语句必须和错误处理程序在同一个过程中。
在下面的例子中,使用到了上面提到的三种属性来处理一个除数为零的错误。
Private Sub Result-Click()
    On Error GoTo err1
    Text3.Text = Text1.Text / Text2.Text
    Msgbox “Error resolved”
    Exit sub
err1:
    MsgBox Err.Number
    MsgBox Err.Description
    MsgBox Err.Source
    If Err.〖ZK(〗Number = 11 Then
            Text2.Text = Text2.Text + 1
    End If
    Resume
End Sub
2、   Err对象的方法
Clear方法
在错误处理后清除Err对象的所有属性的值。使Resume语句或On Error语句之后或是结束一个子程序块或一个函数过程之后都会自动调用这个方法。
语法格式:Object.Clear
Raise方法
这个方法用来产生一个错误。它是在测试和评估的时候使用的。这样可以主动地产生错误,以便在程序其他地方的错误处理程序来对它进行处理。
语法格式:Object.Raise number,source,description,helpfile, helpcontext
除了number以外的所有参数都是可选的
请看下面的实例
Private 〖ZK(〗Sub cmdError_Clickbr>     Dim num As Integer
    num=Val(Text1.Text)
    On Error GoTo NoErr
    Err.Raise num
Exit Sub
NoErr:
    Select case Err.Number
Case 6
MsgBox “Data Overflow"Text1.SetFocus
Case 11
MsgBox "Division by zero"Text1.SetFocus
Case else
MsgBox "Error not known"Exit Sub
    End select
Text1.Text=“ "
End Sub
四、跟踪错误
对程序中发生的错误进行捕获。当执行一个标志着错误处理程序开始的On Error语句时就引发了对错误的跟踪。当执行到Exit Sub、Exit Function、Exit Property、End Sub、End Function
或End Property语句时就意味着跟踪的结束。可以使用On Error GoTo 0来结束对错误的跟踪。
考虑用下面两种跟踪和处理错误的方法 :即时处理和延时处理
1、错误的即时处理
在程序错误一发生时就转向错误处理程序并马上进行处理。“On Error GoTo line"语句给出了错误处理程序的入口位置。错误处理程序一般以一个标号开始,这个标号也就是在On Error GoTo语句中使用到的标号。错误处理程序采取相应的动作来解决出现的错误并从出错的语句或者出错语句的下一条语句接着运行程序。需要一条语句在错误处理程序完成后结束这个过程(Exit Sub)。
2、错误的延时处理
这种方法中VB忽略发生的错误,但是代码最后检测到这个错误。用于象除数为零等这种错误。错误处理代码用来重新设置变量的值,使得程序可以继续执行下去。
缺点是在可能出错的地方,都需要编写错误处理代码。Err对象在一个新的错误产生时不保存先前的错误信息。但是我们可以使用“On Error Resume Next"语句来激发这种错误处理方法。会让Visual Basic在错误已经发生后继续执行程序。
下面的例子就是先查看Err对象的Number属性,如果该属性的值大于0,则表明有多个错误发生了。
  1. Private Sub Command1-Click()
  2.     On Error Resume Next
  3.     Text3.Text= Text1.Text / Text2.Text
  4.     If Err.Number > 0 Then
  5. If Err.Number = 11 Then
  6. Text3.Text = 0
  7. Else
  8. MsgBox “Input not valid"
  9. Exit Sub
  10. End If
  11.     End If
  12. End Sub
  13. “On Error Resume Next"语句标志在此使用的是延迟处理的方法。同时也调用了Clear方法来清除并设置Err对象的属性,为下一个出现的错误做准备。
  14. 创建一个公共错误处理过程
  15. 下面的代码就创建了一个函数Check,它在用户没有输入顾客的名称时产生一个错误:
  16. Function check( )
  17.     If Text1.Text = “ ” Then
  18.             Err.Raise 900, , “No blanks allowed”
  19.     Else
  20.             MsgBox “Record saved"
  21.     End If
  22. End Function
  23. Private Sub Save-Click()
  24.     Call  check
  25. End Sub
复制代码


分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享淘帖0 收藏收藏0 评分评分
你老婆要生了。我要当爹了
您需要登录后才可以回帖 登录 | 立即注册


手机版|SKY外语计算机学习 ( 粤ICP备12031577 )    

GMT+8, 2024-5-4 09:15 , Processed in 0.114921 second(s), 27 queries .

回顶部