标题:关于VB错误捕捉的问题
只看楼主
VB丶小宇
Rank: 3Rank: 3
来 自:河北省石家庄市
等 级:论坛游侠
帖 子:172
专家分:142
注 册:2013-3-11
结帖率:96.77%
已结贴  问题点数:100 回复次数:6 
关于VB错误捕捉的问题
改变文字属性的小程序:

控件:Command按钮共5个。
核心代码:
程序代码:
Option Explicit
Private Sub Command1_Click()
Form1.FontBold = True          '设置Form1窗体的字体为粗体
Print "这是粗体"               '在窗体上输入一句话:这是粗体            
End Sub
Private Sub Command2_Click()
Form1.FontBold = False         '设置Form1窗体的字体为带下划线的
Form1.FontItalic = False
Form1.FontUnderline = True
Print "这是带下划线的"         '在窗体上输入一句话:这是带下划线的
End Sub
Private Sub Command3_Click()
Form1.FontBold = False         '设置Form1窗体的字体为斜体
Form1.FontItalic = True
Print "这是斜体"               '在窗体上输入一句话:这是斜体
End Sub
Private Sub Command4_Click()
Form1.FontBold = False         '设置Form1窗体为带删除线的
Form1.FontItalic = False
Form1.FontUnderline = False
Form1.FontStrikethru = True
Print "这是带删线的"           '同上,依次类推。
End Sub
Private Sub Command5_Click()
On Error GoTo err1             '错误捕捉程序,在发生错误的情况下跳转到err1
Dim a As String                '设置a为字符串型变量
a = InputBox("输入要改变的字号", "提示", "")     '用Inputbox带出用户要改变的字号并将其赋值给a
Form1.FontSize = a             '将Form1窗体的字体大小设置为13
If Error.Number = 13 Then      'If判断语句,如果满足错误代码=13
Exit Sub                       '那么退出过程
err1:                          '跳转到错误处理部分
MsgBox "请在文本框中输入字号", vbOKOnly + vbCritical, "错误提示"    '弹出的警示窗
End If
Err.Clear                     
End Sub
四个问题:
Q1:Err.Clear的意思,是清除错误处理部分,还是清除错误信息,或者其他的?
A1:
Q2:这个错误捕获程序,为何要在
If Error.Number = 13 Then
这句代码后加一个Exit Sub退出过程的代码?不退出过程,直接到错误处理部分不行吗?
A2:
Q3:我没加Exit Sub这句代码时,会出现如图的错误:
,发生这个错误的原因是什么?
A3:
Q4:这个程序,设计的是在错误代码(error=13)=13的情况下,才跳转到错误处理部分,弹出警示窗。为何我在Inputbox的文本框中输入了数字,(删除错误捕捉的代码,可以测试出在此处并没有弹出错误代码=13的弹窗)仍旧弹出警示窗,为何?
A4:
因为问题较多,所以为了更加清楚的表达,故上传源文件,期待大神解决。
源文件:
改变字体属性.rar (1.98 KB)
2014-03-20 21:17
owenlu1981
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:13
帖 子:211
专家分:1130
注 册:2013-5-17
得分:10 
1. Err.Clear --> 清除程序错误信息 (VB在执行程序时有时候会出现一些非代码本身造成的异常Error)
2. If Error.Number = 13 Then --> 没看到有定义 Error,如果是 Err.Number, 则13表示类型不符合
请问Private Sub Command5_Click() 这段程序哪来的?确保是正确的吗?
2014-03-20 23:00
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:90 
四个问题:
Q1:Err.Clear的意思,是清除错误处理部分,还是清除错误信息,或者其他的?
A1:清除当前错误信息,让错误捕捉部分可以继续工作。调用API等及有些非代码部分会产生错误,也会导致错误,这些情况下是需要用命令去检测是否产生的错误。
    不清除错误信息,有可能造成检测错误的结果是 不正确的。

Q2:这个错误捕获程序,为何要在这句代码后加一个Exit Sub退出过程的代码?不退出过程,直接到错误处理部分不行吗?
A2:一般来说,错误捕获程序后面的代码应该是有很多,很长的一段判断,有些甚至有 返回到错误出现的那句重新执行的命令。在这种情况下,如果错误处理程序前面不加 exit sub 的话,有可能导致程序执行到错误捕获程序里去,当有一个非正常状态下执行的命令时,就会导致运行结果更加不正确。
    一般来说,凡有错误捕获的代码,在错误捕获的代码前都要加上 exit sub ,防止代码运行不可控。

Q3:我没加Exit Sub这句代码时,会出现如图的错误:
A3:我测试时没发现你这种情况。估计是你把这个标签也给删掉了。
    err1:                          '跳转到错误处理部分  
    这行是标签,标签以 标识符开始,以冒号结束,单独占用一行。 如果前面有 goto 命令,那么就必须要有对应的 标签。不管这个GOTO是 使用陷井的,还是无条件转移。

Q4:这个程序,设计的是在错误代码(error=13)=13的情况下,才跳转到错误处理部分,弹出警示窗。为何我在Inputbox的文本框中输入了数字,(删除错误捕捉的代码,可以测试出在此处并没有弹出错误代码=13的弹窗)仍旧弹出警示窗,为何?
A4:我测试的结果是你的代码顺序错了:代码的顺序应该是:
  
On Error GoTo err1             '错误捕捉程序,在发生错误的情况下跳转到err1
Dim a As String                '设置a为字符串型变量
a = InputBox("输入要改变的字号", "提示", "")     '用Inputbox带出用户要改变的字号并将其赋值给a
Form1.FontSize = a             '将Form1窗体的字体大小设置为13
Exit Sub                       '那么退出过程
err1:                          '跳转到错误处理部分
If Err.Number = 13 Then      'If判断语句,如果满足错误代码=13
MsgBox "请在文本框中输入字号", vbOKOnly + vbCritical, "错误提示"    '弹出的警示窗
End If
Err.Clear

    看到了没,出现这个提示的原因是你的 标签的位置弄错了,可能是拖动代码造成的。
因为 有一个标签,所以前面那个 if 被强制 结束了,然后执行 标签后的命令。产生这个提示。

授人于鱼,不如授人于渔
早已停用QQ了
2014-03-21 11:53
VB丶小宇
Rank: 3Rank: 3
来 自:河北省石家庄市
等 级:论坛游侠
帖 子:172
专家分:142
注 册:2013-3-11
得分:0 
非常感谢楼上两位的回复,经过3L版主的回复,找到问题的原因了,也积累了不少的知识。再次感谢!

编程最蛋疼的事:不是编程多么累,而是编完后,一点运行,出现四个字:程序错误。。。
2014-03-21 19:47
VB丶小宇
Rank: 3Rank: 3
来 自:河北省石家庄市
等 级:论坛游侠
帖 子:172
专家分:142
注 册:2013-3-11
得分:0 
回复 3楼 风吹过b
我的逻辑是:判断如果发生错误,错误代码13(if error.number=13)——退出过程——跳转到错误处理部分——给予相应的措施——清除错误信息,保证错误处理部分继续正常工作。
你的逻辑:退出过程——跳转到错误处理部分——判断如果发生错误,错误代码13——给予相应的措施——清除错误信息,保证错误处理部分继续正常工作。
感觉你的逻辑接受不了啊。。。不同于正常人的逻辑啊。。
另外,在更改为你的顺序后,又发生了未知的错误。
这次是实时错误424。。单击改变字体大小,—取消,或者输入框为空,就会触发这个错误,原来错误代码是13,现在成424了。。所以这个错误处理部分也就没用了,而改回我原来的代码顺序,这个错误代码就是13,并且能正常给予提示。为何?

编程最蛋疼的事:不是编程多么累,而是编完后,一点运行,出现四个字:程序错误。。。
2014-03-21 21:49
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
要对inputbox 的返回值进行判断,而不要靠错误捕获程序来提示。

if val(a)>3 and val(a)<128 then
    form1.fontsize=val(a)
else
    msgbox "请在文本框中输入字号",
endif
-------
你前面是测试错误捕获程序,所以没有指出这个问题。
为什么软件会有bug,很多就是这种的没有判断而直接调用造成的。

授人于鱼,不如授人于渔
早已停用QQ了
2014-03-22 12:36
VB丶小宇
Rank: 3Rank: 3
来 自:河北省石家庄市
等 级:论坛游侠
帖 子:172
专家分:142
注 册:2013-3-11
得分:0 
回复 6楼 风吹过b
感谢您的解答,问题解决,谢谢。

编程最蛋疼的事:不是编程多么累,而是编完后,一点运行,出现四个字:程序错误。。。
2014-03-22 21:02



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-428889-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.264579 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved