gpt4 book ai didi

vba - 我们是否需要为每个子程序创建一个错误处理程序?

转载 作者:行者123 更新时间:2023-12-04 17:12:44 26 4
gpt4 key购买 nike

我从 SO 中复制了一段代码作为示例。该子例程包含一个错误处理程序。是否应该为所有订阅者创建一个错误处理程序?

Public Sub SubA()
On Error Goto ProcError

Connection.Open
Open File for Writing
SomePreciousResource.GrabIt

ProcExit:
Connection.Close
Connection = Nothing
Close File
SomePreciousResource.Release

Exit Sub

ProcError:
MsgBox Err.Description
Resume ProcExit
End Sub

还有顺便说一下,当代码执行器遇到 Exit Sub时,子程序内部的控制流程是怎么做的? , End SubResume ?而当它遇到诸如 ProcError:之类的标签时在执行过程中,它是执行它还是跳过它?

最佳答案

简短的回答是:不,您不仅不需要在每个过程中都有一个错误处理程序,而且实际上您通常不希望在每个过程中都有一个错误处理程序。

您将希望在最有意义的地方进行错误处理。通常,您只需要最高级别过程中的错误处理程序,即调用所有其他程序的错误处理程序;较低级别的程序应该将问题踢到楼上,让错误“冒泡”到更高级别的程序。有时您需要在较低级别的过程中进行一些错误处理。

有关更多信息,请参阅@jtolle 的这两个出色答案:

  • VBA Error "Bubble Up"
  • Handling errors in math functions

  • 此外,互联网搜索将显示网络上有关于错误处理的完整文献。在我看来,有些是完全错误的!但如果它坚持我在前两段中写的内容,那么就值得考虑。
    Exit SubEnd Sub相当直观:前者停止执行当前 Sub 并将控制权返回给调用它的过程(如果该过程没有被另一个过程调用,则完全停止执行)。后者只是向编译器表明此特定 Sub 的代码结束的地方——如果执行, End Sub表现得像 Exit Sub .
    Resume指定在错误处理例程完成后接下来应该发生什么。普通 Resume返回到导致错误的同一语句并尝试再次执行它。 Resume Next跳过导致错误的语句,而是转到紧随其后的语句。 Resume mylabel转到标签 mylabel: .

    如果标签如您的 ProcError:在执行过程中遇到,然后没有什么特别的事情发生,并且执行继续到标签之后的下一条语句。当然,在你的例子中, ProcError:因为有一个 Exit Sub 永远不会被直接执行(即除非出现错误否则不会被执行)就在它之前。

    顺便说一句, ProcExit:块应该以 On Error Resume Next 开头(即继续关闭所有内容并退出,而不管任何错误),或者如@Phydaux 所指出的, On Error Goto 0 (出错时,停止执行),否则如果其中的某些内容触发了错误,您可能会进入错误处理程序和 ProcExit: 之间的无限循环。代码。
    ProcExit:
    On Error Resume Next ' or, alternatively, On Error Goto 0
    Connection.Close
    Connection = Nothing
    Close File
    SomePreciousResource.Release
    Exit Sub

    关于vba - 我们是否需要为每个子程序创建一个错误处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6149273/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com