【发布时间】:2014-11-04 12:53:06
【问题描述】:
我的应用程序有几个相互调用的表单。我遇到了错误处理问题,由于项目太大而无法在此处发布,因此我创建了仍然重现问题的最小代码子集。该文件可以找到here
问题的组成部分:
-
raiseError- 一个简单地引发错误的函数 -
mainForm- 带有一个按钮的表单 - 点击后打开addClientForm -
addClientForm- 通过raiseError引发错误的表单 -
showMainForm- 显示mainForm的来电者
代码真的很简单,
模块错误
Public Sub raiseError()
Call Err.Raise(2048, "errorSource", "errorDescription")
End Sub
主窗体
Private Sub cbAddClientForm_Click()
Dim xAddClientForm As New addClientForm: Call xAddClientForm.Show
End Sub
AddClientForm
Private Sub UserForm_Initialize()
Call raiseError
End Sub
来电者
Public Sub caller()
On Error GoTo ErrorHandler
Dim xMainForm As New mainForm: Call xMainForm.Show
ErrorExit:
Exit Sub
ErrorHandler:
Call MsgBox("Error appeared", vbOKOnly)
On Error Resume Next
GoTo ErrorExit
End Sub
caller 显示一个mainForm,一旦用户单击该按钮,就会初始化一个addClientForm,从而调用raiseError。问题是caller 中的ErrorHandler 没有捕捉到错误!相反,raiseError 中引发的错误被视为未处理的错误!这意味着会出现一个丑陋的 messageBox 并将用户直接推入 VBEditor 中的代码 - 这是我想要避免的。
我摆弄了这个问题的各种设置,只要不存在一个调用另一个的表单序列,错误处理就会按预期工作。在附件中,所有调查与测试假设一起写入不同的模块。
所以问题是
- 为什么会这样
- 如何解决这个问题,即如何捕获表单引发的错误,以免用户进入 VBEditor?
非常感谢任何帮助或解决方法。 丹尼尔
【问题讨论】:
-
我认为您正在遭受this issue 的困扰。简短的回答是不要在 Class_Initalize() 事件过程中引发错误。
-
@RubberDuck:谢谢您的回复,但是,当我将按钮放在
addClientForm上并仅在此按钮的 _Click 事件中引发错误时,行为仍然相同 - 出现错误未处理。 -
@DanielBencik 在 [常规] 选项卡的 [错误处理] 部分中验证您的选项 - 确保选中“未处理错误中断”。