我测试了微软关于
On Error Resume Next
声明范围的声明:
当调用另一个过程时,
语句将变为非活动状态,因此如果您希望在该例程中进行内联错误处理,则应在每个被调用的例程中执行On Error Resume Next
语句。On Error Resume Next
但在我的测试中,在调用我故意以 de line 结尾的函数或过程后,
On Error Resume Next
根本没有变得不活动。On Error Goto 0
我认为这会引发错误。但事实并非如此。
发生什么事了?
Sub CalledSub ()
MsgBox "Hello"
On error goto 0
End Sub
Sub CallingSub ()
On Error Resume Next
Call CalledSub
MsgBox 1/0
End Sub
保持活动状态。作为一名程序员,您不希望被调用的例程影响您的代码流程。
On Error Resume Next
或
On Error Resume Next
),则它被视为已处理并且不会再发生任何事情 - 程序将简单地继续。
您的代码 - 被调用例程不会影响调用例程的错误处理。调用例程创建一个错误并处理它(通过忽略它)。
On Error Goto 0
被调用的子程序有运行时错误,但会自行处理 - 不会显示错误并且继续执行(您*将”看到 MsgBox“我继续”)
Sub CalledSub1()
MsgBox "Hello"
On Error GoTo 0
End Sub
Sub CallingSub1()
On Error Resume Next
Call CalledSub1
MsgBox 1 / 0
End Sub
被调用的例程创建一个错误,但不处理它。被调用的子程序的执行被停止(您不会看到MsgBox“Hello”),并且错误正在冒泡到处理它的调用例程,并且执行继续(您“将”看到MsgBox“我继续”) )
Sub CalledSub2()
On Error Resume Next
MsgBox 1 / 0
End Sub
Sub CallingSub2()
Call CalledSub2
MsgBox "I continue"
End Sub
被调用的例程创建一个错误,但不处理它。同样,错误正在冒泡到被调用的例程。由于现在调用例程也不处理它,因此它显示为 VBA 运行时错误。执行停止(您不会看到MsgBox“我继续”,因为程序在此之前已停止。)
Sub CalledSub3()
MsgBox 1 / 0
MsgBox "Hello"
End Sub
Sub CallingSub3()
On Error Resume Next
Call CalledSub3
MsgBox "I continue"
End Sub