On Error Goto 对一个函数内连续两次出错该如何处理?

xmuyounger 2014-08-19 05:27:56
对于On Error Goto 语句
MSDN 中 是这么解释的:
如果在错误处理程序处于活动状态时(在发生错误和执行 Resume、Exit Sub、Exit Function 或 Exit Property 语句之间这段时间)又发生错误,则当前过程的错误处理程序将无法处理这个错误。
那么问题在于,若我需要在一个函数中需要连续多次使用On errorGoto 语句进行错误情况的跳转时候,第二次开始的就无法按照要求跳转。譬如原有的代码结果如下:
On error Goto Lable1
' 语句1-3 处理 对象1, 可能会因为对象1的不同属性而出错,出错时候希望跳转到语句11,开始处理对象2
语句 1
语句 2
语句 3
Lable1:
on error goto Lable2
' 语句11-13 处理 对象2, 可能会因为对象2的不同属性而出错
语句 11
语句 12
语句 13
Lable2:
on error goto Lable3
' 语句21-23 处理 对象3, 可能会因为对象3的不同属性而出错
语句 21
语句 22
语句 23
************************
总体的思路:
就是当处理对象1时若出错,就跳转到处理对象2处理,若处理对象2出错,就跳转到对象3处理。
但是问题在于,On error goto 语句在处理第一次出错后,后续就不管用了,当对象1出错跳转后,
就无法处理对象2的错误跳转。整个程序就卡在那里。
请问各位前辈,要如何处理。
处理各个对象的情况比较复杂,所以没办法事先判断在哪里可能会出错。当然可能出错的情况
在程序中都尽可能的考虑到。
这样一种逻辑结构要如何处理。谢谢。
...全文
984 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmuyounger 2014-09-10
  • 打赏
  • 举报
回复
看了10楼版主bcrun的帖子后,改成这样了,请各位大大看看能行不? On error Goto Lable1 ' 语句1-3 处理 对象1, 可能会因为对象1的不同属性而出错,出错时候希望跳转到语句11,开始处理对象2 语句 1 语句 2 语句 3 Lable1: Resume test1 test1: on error goto Lable2 ' 语句11-13 处理 对象2, 可能会因为对象2的不同属性而出错 语句 11 语句 12 语句 13 Lable2: Resume test2 test2: on error goto Lable3 ' 语句21-23 处理 对象3, 可能会因为对象3的不同属性而出错 语句 21 语句 22 语句 23 ************************ 其实就是人为的增加一个 resume语句,测试了一下,似乎可以,就不知道是否会有什么潜在的错误
赵4老师 2014-08-25
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
在错误处理中调用另一个Sub,在这个Sub中再On Error
正解!
熊孩子开学喽 2014-08-25
  • 打赏
  • 举报
回复
On error本来就是让你调试源码用的, 考虑得周全一些, 代码写得健壮了, 就不会有你这种问题了.
PctGL 2014-08-23
  • 打赏
  • 举报
回复
在错误中处理错误的例子。。。 不过,这个是会有异议的

Option Explicit

 
Private Sub Command1_Click()
          
l1:
    On Error GoTo -1
    On Error GoTo l2

    Debug.Print "l1"
    Debug.Print 1 / 0
    Exit Sub
l2:
    On Error GoTo -1
    On Error GoTo l3
    Debug.Print "l2"
    Debug.Print 1 / 0
    Exit Sub
   
l3:
    On Error GoTo -1
    On Error GoTo l4
 
    Debug.Print "l3"
    Debug.Print 1 / 0

l4:
    On Error GoTo -1
    On Error GoTo l5
 
    Debug.Print "l4"
    Debug.Print 1 / 0

l5:
    On Error GoTo -1
    On Error GoTo l1
 
    Debug.Print "l5"
    Debug.Print 1 / 0

   Stop
     
End Sub
赵4老师 2014-08-22
  • 打赏
  • 举报
回复
在错误处理中调用另一个Sub,在这个Sub中再On Error
bcrun 2014-08-22
  • 打赏
  • 举报
回复
#6说得不错,另外,这个问题我前一阵还专门发帖解释过: http://bbs.csdn.net/topics/390803908 [推荐] [原创技术分享]VB6错误处理进阶(同过程中多次错误处理)
三楼の郎 2014-08-21
  • 打赏
  • 举报
回复
on error resume next + err.number值判断,例如: on error resume next 语句1 if err.number<>0 then err.clear goto label1 end if 语句2 if err.number<>0 then err.clear goto label1 end if …… goto exitlabel label1: 语句11 if err.number<>0 then err.clear goto label2 end if 语句12 if err.number<>0 then err.clear goto label2 end if …… exitlabel:
PctGL 2014-08-21
  • 打赏
  • 举报
回复

Option Explicit

Private Sub Command1_Click()
    
    
    On Error GoTo l2
    
l1:
    Debug.Print "l1"
    Debug.Print 1 / 0
    Exit Sub
l2:
    On Error GoTo -1
    On Error GoTo l3
    Debug.Print "l2"
    Debug.Print 1 / 0
    Exit Sub
  
l3:
    On Error GoTo -1
    On Error GoTo l3

    Debug.Print "l3"
    Debug.Print 1 / 0
    
   stop   
    
End Sub


Tiger_Zhao 2014-08-20
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim iProgress As Long '区分不同的步骤
Dim obj1 As Object
Dim obj2 As Object
Dim obj3 As Object
Dim i As Long

On Error GoTo ErrHandler

iProgress = 1
i = 100 / obj1.length

Step2:
iProgress = 2
Set obj2 = New Collection
i = 100 / obj2.length

Step3:
iProgress = 3
Set obj3 = New Collection
i = 100 / obj3.Count

MsgBox "总算有成功的!"

ExitEntry:
Exit Sub
ErrHandler:
Debug.Print iProgress, Err.Number, Err.Description
Select Case iProgress
Case 1
Resume Step2
Case 2
Resume Step3
End Select
MsgBox "全部出错了!"
Resume ExitEntry
End Sub
threenewbee 2014-08-20
  • 打赏
  • 举报
回复
加上On Error Goto 0或者用Resume
一如既往哈 2014-08-19
  • 打赏
  • 举报
回复
个人感觉没有必要对所有潜在的错误都进行处理............
xmuyounger 2014-08-19
  • 打赏
  • 举报
回复
引用 2 楼 Topc008 的回复:
可以适当考虑on error resume next.....
也曾考虑过这种写法, 加上 if (err.num <> 0 ) then .... else .... 这样的写法。但是能力有限,一直没有想到最终的方法
xmuyounger 2014-08-19
  • 打赏
  • 举报
回复
引用 1 楼 clear_zero 的回复:
你在label1下面写 err.clear试试看
试过了,没有用 err.clear 只能把 err 的值给清零,但是好像不能在其内部的中断机制给复位
一如既往哈 2014-08-19
  • 打赏
  • 举报
回复
可以适当考虑on error resume next.....
clear_zero 2014-08-19
  • 打赏
  • 举报
回复
你在label1下面写 err.clear试试看

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧