简短的回答是:不,你不仅不这样做need在每个过程中都有一个错误处理程序,但实际上您通常不会want每个过程中都有一个错误处理程序。
您将希望在最有意义的地方进行错误处理。通常,您只需要在最高级别的过程中使用一个错误处理程序,即调用所有其他过程的错误处理程序;较低级别的程序应该将问题踢到楼上,让错误“冒泡”到较高级别的程序。有时您需要在较低级别的过程中进行一些错误处理。
有关更多信息,我建议您参考 @jtolle 的两个出色答案:
- VBA 错误“冒泡” https://stackoverflow.com/questions/1418777/vba-error-bubble-up/1419147#1419147
- 处理数学函数中的错误 https://stackoverflow.com/questions/4429965/handling-errors-in-math-functions
此外,互联网搜索将显示网络上有大量有关错误处理的文献。在我看来,有些是完全错误的!但如果它符合我在前两段中所写的内容,那么就值得考虑。
Exit Sub
and End 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:
code.
ProcExit:
On Error Resume Next ' or, alternatively, On Error Goto 0
Connection.Close
Connection = Nothing
Close File
SomePreciousResource.Release
Exit Sub