VBA的3种错误处理方式 on error goto 0 /-1 , on error resume next , on error goto index,是抛出异常,还是忽略报错,还是进行错误捕捉?

总结

  • on error goto 0 /-1        '直接抛出异常
  • on error resume next    '忽略,但是可以配合 if 等来处理
  • on error goto  index       '处理异常

1 基本错误捕捉语句 (自动抛出异常)

  • on error goto 0     约等于   缺省默认,什么也不写
  • on error goto 0     停止执行!并且直接抛出对应错误。
  • on error goto -1  处理掉前面的出错进程,又开启一个新的,也会报错
  • 两者详细差别,stack overflow上有

excel - Difference between 'on error goto 0' and 'on error goto -1' -- VBA - Stack Overflow

 

2 其他错误处理语句 (不抛出异常 / 不管异常 / 或 同时自己处理异常)

  • on error resume next
  • on error resume next  配合 if 一样可以部分实现 类 on error goto 0 效果,但一般来说肯定没有on error goto 0 全!

 一个例子

Sub t5()

On Error Resume Next
a = 1 / 0
Debug.Print "a=" & a

On Error GoTo 0
b = 1 / 0
Debug.Print "b=" & b

End Sub

3 错误处理其他方法

  • on error goto  index
  • 配合 index 使用
  • 注意  block 是顺序执行,on error goto  index 只影响它后面的语句

  • 纯文本提示也可以
  • on error goto  Err_Handle
  • 配合Error_Handle:使用

Error_Handle:
    errNum = ErrorsHandle
    If errNum = 0 Then
        Resume
    ElseIf errNum = 1 Then
        Resume Next
    Else
        Exit Sub
    End If

举例说明,如果要多次处理不同的错误,或者分段处理报错

  • on error goto XX  单独使用一般只能处理一次报错,写多个也没用
  • on error goto XX  配合 on error goto -1 可以处理这种情况
  • on error resume next 屏蔽报错,然后用if 处理也可以(但是要有if 确实遍历了所有出错的可能性)

例子1 

Sub t2()

    On Error GoTo line1
    a = 1 / 0
    Debug.Print "11"
line1:
    Debug.Print "12"
    
    On Error GoTo line2
    b = 1 / 0
    Debug.Print "21"
line2:
    Debug.Print "22"
        
    On Error GoTo line3
    c = 1 / 0
    Debug.Print "31"
line3:
    Debug.Print "32"

End Sub

例子2

Sub t4()

    On Error GoTo line1
    a = 1 / 0
    Debug.Print "11"
line1:
    On Error GoTo -1
    Debug.Print "12"
    
    On Error GoTo line2
    b = 1 / 0
    Debug.Print "21"
line2:
    On Error GoTo -1
    Debug.Print "22"
        
    On Error GoTo line3
    c = 1 / 0
    Debug.Print "31"
line3:
    On Error GoTo -1
    Debug.Print "32"

End Sub

例子3 

Sub t3()

On Error Resume Next
    a = 1 / 0
    Debug.Print "11"
line1:
    Debug.Print "12"
    
    b = 1 / 0
    Debug.Print "21"
line2:
    Debug.Print "22"
        
    c = 1 / 0
    Debug.Print "31"
line3:
    Debug.Print "32"

End Sub

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值