简短的回答是:不,您不仅不需要在每个过程中都有一个错误处理程序,而且实际上您通常不希望在每个过程中都有一个错误处理程序。
您将希望在最有意义的地方进行错误处理。通常,您只希望在最高级别的过程中有一个错误处理程序,即调用所有其他程序的错误处理程序;较低级别的程序应该将问题踢到楼上,并让错误“冒泡”到较高级别的程序。有时您会希望在较低级别的过程中进行一些错误处理。
有关更多信息,我建议您参考@jtolle 的这两个出色的答案:
此外,互联网搜索将显示网络上有关于错误处理的完整文献。在我看来,其中一些是完全错误的!但如果它坚持我在前两段中写的内容,那么值得考虑。
Exit Sub
并且End Sub
相当直观:前者停止当前 Sub 的执行并将控制权返回给调用它的过程(如果该过程未被另一个过程调用,则完全停止执行)。后者只是向编译器表明这个特定 Sub 的代码在哪里结束 - 如果执行,End Sub
行为类似于Exit Sub
.
Resume
指定错误处理例程完成后接下来应该发生的事情。PlainResume
返回到导致错误的同一语句并尝试再次执行它。Resume Next
跳过导致错误的语句,而是转到紧随其后的语句。Resume mylabel
去标签mylabel:
。
如果在执行过程中遇到了诸如 your 之类的标签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