On Error Resume Next 语句的范围到底是什么?

问题描述 投票:0回答:1

我测试了微软关于

On Error Resume Next
声明范围的声明:

当调用另一个过程时,

On Error Resume Next
语句将变为非活动状态,因此如果您希望在该例程中进行内联错误处理,则应在每个被调用的例程中执行
On Error Resume Next
语句。

但在我的测试中,在调用我故意以 de line 结尾的函数或过程后,

On Error Resume Next
根本没有变得不活动。
On Error Goto 0

我认为这会引发错误。但事实并非如此。

发生什么事了?

excel vba error-handling
1个回答
0
投票

    每个例程负责自己的错误处理。被调用的子例程不能影响调用子例程的错误处理。这就是您没有看到错误的原因 - 调用例程的
  1. Sub CalledSub () MsgBox "Hello" On error goto 0 End Sub Sub CallingSub () On Error Resume Next Call CalledSub MsgBox 1/0 End Sub

    保持活动状态。作为一名程序员,您不希望被调用的例程影响您的代码流程。

    
    

  2. 如果发生运行时错误并且例程处理了它(通过
  3. On Error Resume Next

    On Error Resume Next
    ),则它被视为已处理并且不会再发生任何事情 - 程序将简单地继续。
    
    

  4. 如果发生运行时错误并且例程无法处理它,它就会“冒泡”到顶部:它会被提升到调用例程。如果这可以处理它,那么可以 - 如果没有,它就会被提升到调用例程的调用例程(依此类推)。如果没有一个可以处理它(并且没有“更高”的调用例程),则由 VBA 运行时通过显示已知的错误对话框来处理它。
  5. 示例:

(1)

您的代码 - 被调用例程不会影响调用例程的错误处理。调用例程创建一个错误并处理它(通过忽略它)。 On Error Goto 0

(2)

被调用的子程序有运行时错误,但会自行处理 - 不会显示错误并且继续执行(您*将”看到 MsgBox“我继续”) Sub CalledSub1() MsgBox "Hello" On Error GoTo 0 End Sub Sub CallingSub1() On Error Resume Next Call CalledSub1 MsgBox 1 / 0 End Sub

(3)

被调用的例程创建一个错误,但不处理它。被调用的子程序的执行被停止(您不会看到MsgBox“Hello”),并且错误正在冒泡到处理它的调用例程,并且执行继续(您“将”看到MsgBox“我继续”) ) Sub CalledSub2() On Error Resume Next MsgBox 1 / 0 End Sub Sub CallingSub2() Call CalledSub2 MsgBox "I continue" End Sub

(4)

被调用的例程创建一个错误,但不处理它。同样,错误正在冒泡到被调用的例程。由于现在调用例程也不处理它,因此它显示为 VBA 运行时错误。执行停止(您不会看到MsgBox“我继续”,因为程序在此之前已停止。) Sub CalledSub3() MsgBox 1 / 0 MsgBox "Hello" End Sub Sub CallingSub3() On Error Resume Next Call CalledSub3 MsgBox "I continue" End Sub

	
© www.soinside.com 2019 - 2024. All rights reserved.