总结
- 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