我正在学习错误处理,我想我已经掌握了窍门。但是我遇到了一个有趣的行为。我在我的类模块中处理我的错误,我把错误从堆栈中取出。我有可追溯性,所以当错误到达调用者时(或栈顶)显示一个错误,告诉我它发生在哪里。如果类是从模块调用的,它就能正常工作。但是如果类是从工作表或工作簿调用的,那么它会生成一个未处理的运行时错误。
例如,下面的代码:
sub testError
err.raise -1000,,"This is a custom error"
end sub
如果我在一个常规模块中运行它,我会得到以下结果:
但如果我在工作表或工作簿中运行完全相同的代码,我会得到以下结果:
所以我的一些类是从工作表上的宏调用的,其他的是从工作簿和/或工作表事件调用的,如果一个已处理的错误发生了,我会得到一个未处理的运行时错误,没有任何有用的信息。
我可以把我的宏移到一个标准模块中,但是我不能把我的事件(值的改变,新的计算等等)移到一个标准模块中。
所以我有两个问题:为什么我不能在工作表/练习册上做错误提示?
我该怎么办呢?
谢谢。
1条答案
按热度按时间2ekbmq321#
所以深入研究一下这个问题。VBA会给你两种错误弹出窗口:
原来您只能使用带有end/debug按钮的弹出窗口修改描述。(通过err.raise)。
决定你看到的弹出窗口是栈顶的位置。如果是在标准模块中,你会看到"end/debug"弹出窗口。如果是在工作表/工作簿对象中,你会看到"okay/help"弹出窗口。
未处理的错误会一直出现在栈顶。如果栈顶在标准模块中,那么你可以选择按调试按钮,它会把你带到错误发生的那一行。如果栈顶在工作表/工作簿中,你就不知道它发生在哪里。
为了说明我的观点,下面的代码将抛出一个标准的运行时错误:
如果这个方法在标准模块中运行,你会得到:
如果你在工作表/工作簿中运行它,你会得到这个:
后者在err.raise中不能很好地工作(你不能编辑描述)。
我的问题是我的宏和事件是在工作表/工作簿中启动的。这些方法然后调用模块中的其他方法。但是由于顶部堆栈位于工作表/工作簿中,所以我的错误处理就不起作用了。
所以我的工作是初始化我的模块级方法,把这些方法放在堆栈的顶部,然后它就工作了:
而不是从工作表/工作簿调用此方法,如下所示:
请执行以下操作:
这样做会将createClass方法放在堆栈的顶部。并且由于这是在标准模块中,错误处理将按预期工作。