【问题标题】:VBA Error Handling: Catch and Re-throw Not PropagatingVBA 错误处理:捕获和重新抛出不传播
【发布时间】:2018-02-25 12:52:49
【问题描述】:

我正在开发一个相当大的 VBA 应用程序,并希望确保我能够稳健地处理错误。

在我的调用子/函数中,我想捕获错误并将其传递给全局错误处理程序。

我的解决方案基于: Dymeng - Rethrow ErrorsExcelMacroMastery

全局错误处理程序构建调用堆栈,然后重新引发错误。

我遇到的问题是在全局错误处理程序上重新引发错误不会将程序流返回到调用上下文,而是显示 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


【解决方案1】:

对不起我的白痴!

我将错误捕获设置为Break in Class Module。一旦我将其更改为 Break on Unhanded Errors,情况就解决了。

【讨论】:

    猜你喜欢
    • 2022-07-26
    • 1970-01-01
    • 2010-11-06
    • 2020-03-16
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多