【发布时间】:2018-02-25 12:52:49
【问题描述】:
我正在开发一个相当大的 VBA 应用程序,并希望确保我能够稳健地处理错误。
在我的调用子/函数中,我想捕获错误并将其传递给全局错误处理程序。
我的解决方案基于: Dymeng - Rethrow Errors 和 ExcelMacroMastery
全局错误处理程序构建调用堆栈,然后重新引发错误。
我遇到的问题是在全局错误处理程序上重新引发错误不会将程序流返回到调用上下文,而是显示 VBA 错误模式。
在下面的示例中,SQL 查询尝试插入具有重复索引的行。这会触发违反 PRIMARY KEY 约束错误。
全局错误处理程序(在模块 UTIL_ErrorHandler 中):
Sub HandleError (ByVal p_Error As DO_Error)
' Manipulate the error data
'...
'Clear the error and re-raise
'REMOVED in response to Wayne's answer: On Error GoTo 0
Err.Raise p_Error.Number, p_Error.Source, p_Error.Description
End Sub
调用代码(在 UTIL_Database 类中)
Public Function Query (ByVal p_querySQL AS String) As ADODB.RecordSet
On Error GoTo ErrHandler
'connection code...
'query code...
ExitProc:
Exit Function
ErrHandler:
Dim myError as New DO_Error
myError.Construct(Err.Number, Err.Source, Err.Description, Erl,
"UTIL_Database.Query")
UTIL_ErrorHandler.HandleError myError
Resume ExitProc
Resume
End Function
调试器在 Err.Raise 时停止
为什么没有将控制权返回给查询函数,我该如何解决?
谢谢。
【问题讨论】:
-
您有“On Error GoTo 0”,这意味着“我将自己处理”。因此,当您“引发”错误时,它会在该行停止。我们做了类似的代码,其中每个子/函数都有错误陷阱,我们将错误信息捕获到数据库表中进行分析。但是,我们只是将信息传递给函数,而您第二次“引发”错误。
-
您好韦恩,感谢您的快速回复。我已经删除了“On Error GoTo 0”,结果保持不变。有什么想法吗?
标签: excel vba error-handling