如果我有一个带错误处理的主程序调用其他程序而没有错误处理,那么错误是否应该汇总到主程序?
如果没有错误处理的过程使用函数而没有错误处理,该怎么办?
是否所有内容都汇总到主程序的错误处理?
答案 0 :(得分:7)
是的,未处理的错误会卷起堆栈。如果您的主例程(或当前事件处理例程)中没有错误处理,则错误将汇总到VBA本身,这将导致程序中止,或重置主机应用程序中的VBA环境。 (你不想那样)。
我可以想到两个明显的例外:一个虚幻和一个真实:
1)如果通过意外的事件路径输入VBA,而不是通过主例程,可能看起来错误返回绕过了您的Main-routines错误处理程序,但实际上,它是另一个线程,所以当它从事件处理程序汇总时,它会独立于Main例程的主线程进入VBA。
2)VBA错误处理无法捕获所有错误,特别是大多数FATAL错误都无法捕获并崩溃(并重置)整个VBA环境。 “Stack Overflow”错误就是一个例子。
答案 1 :(得分:2)
具有错误处理的过程A将捕获所有错误。没有错误处理的过程B将不会捕获任何错误。
如果A调用B和B有错误,它将会卷起并被A的处理程序捕获 如果B呼叫A和B有错误,则不会进行任何处理 如果B调用A和A有错误,A将捕获它。
无论是功能还是程序都没有区别。但是值得注意的是,类模块不会在本地处理错误,而是将它们从堆栈传递回第一个非类模块。
我不确定“你应该”是什么意思,但你想要捕获的错误取决于你想要对错误做什么。例如,如果某个错误要求您对字符串进行小调整然后恢复原状,则需要进行本地处理。在其他情况下,简单性可能需要顶级处理。
答案 2 :(得分:1)
如果错误捕获选项设置为“未处理的错误中断”,则本地处理的错误将始终*被堆栈错误处理程序捕获。您可以在“工具选项”下的IDE中找到此设置。
如果将其设置为“Break on All Errors”,则不会调用任何错误处理程序(本地或堆栈)。如果将其设置为“Break in Class Module”,则不会为类内错误调用类外错误处理程序。
请注意,此选项会更改调试器停止的行:当类模块中发生未处理的错误时,调试器会在调用类的行上停止“在未处理的错误上中断”或在类中的违规行上“打破课堂模块”。
在Access中,可以使用Application.GetOption(“Error Trapping”)和Application.SetOption(“Error Trapping”)以编程方式读取此选项。
*正如RBarryYoung编写的那样,任何VBA错误处理都不会捕获最致命的错误(如堆栈溢出错误)。