Excel VBA错误处理:捕获和重新抛出不传播

Excel VBA错误处理:捕获和重新抛出不传播,excel,vba,error-handling,Excel,Vba,Error Handling,我正在处理一个相当大的VBA应用程序,并希望确保能够可靠地处理错误 在我的调用子/函数中,我希望捕获错误并将其传递给全局错误处理程序 我的解决方案基于: 和 全局错误处理程序构建调用堆栈,然后重新引发错误 我遇到的问题是,在全局错误处理程序上重新引发错误不会将程序流返回到调用上下文,而是显示VBA错误模式 在下面的示例中,SQL查询尝试插入具有重复索引的行。这会触发违反主键约束的错误 全局错误处理程序(在模块UTIL\u ErrorHandler中): 子句柄错误(ByVal p_错误和DO

我正在处理一个相当大的VBA应用程序,并希望确保能够可靠地处理错误

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

我的解决方案基于: 和

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

我遇到的问题是,在全局错误处理程序上重新引发错误不会将程序流返回到调用上下文,而是显示VBA错误模式

在下面的示例中,SQL查询尝试插入具有重复索引的行。这会触发违反主键约束的错误

全局错误处理程序(在模块UTIL\u ErrorHandler中):

子句柄错误(ByVal p_错误和DO_错误) '操作错误数据 '... '清除错误并重新引发 '根据Wayne的回答删除:错误转到0 Err.Raise p_Error.Number、p_Error.Source、p_Error.Description 端接头

调用代码(在类UTIL_数据库中)

    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

作为ADODB.RecordSet的公共函数查询(ByVal p_querySQL作为字符串)
关于错误转到错误处理程序
'连接代码。。。
'查询代码。。。
出口程序:
退出功能
错误处理程序:
将我的错误变暗为新的DO_错误
myError.Construct(Err.Number、Err.Source、Err.Description、Erl、,
“UTIL_Database.Query”)

    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
UTIL_ErrorHandler.HandleError myError
恢复退出程序
简历
端函数

调试时,调试器在Err.Raise上停止

为什么控件没有返回到查询函数,我如何解决


谢谢。

为我的白痴道歉


我将错误捕获设置为中断类模块。一旦我将此更改为“非故意错误时中断”情况就解决了。

您有“错误时转到0”,这意味着“我将自己处理”。因此,当您“引发”错误时,它将停止在该行上。我们编写了类似的代码,其中每个子/函数都有错误陷阱,我们将错误信息捕获到数据库表中进行分析。然而,我们只是将信息传递给一个函数,而您第二次“引发”错误。嗨,Wayne,感谢您的快速响应。我删除了“错误转到0”,结果保持不变。有什么想法吗?