【问题标题】:VB6 Exception Handling within the calling procedure调用过程中的 VB6 异常处理
【发布时间】:2010-08-02 14:54:12
【问题描述】:

我有两个程序 procA 和 procB。 procA 正在调用 procB。 procB 内发生异常。我可以在 procB 中处理异常,但我喜欢在 procA 中处理它,这是我没有开始工作的。我对 VB6 不是很熟悉,但我认为这应该是可能的,因为 MSDN 说:

如果在错误处理程序处于活动状态时发生错误(在错误发生与 Resume、Exit Sub、Exit Function 或 Exit Property 语句之间),则当前过程的错误处理程序无法处理该错误。控制返回调用过程。如果调用过程启用了错误处理程序,则激活它来处理错误。

我做错了什么?

现在是代码片段:

Private Sub procA()
  On Error GoTo ErrHnd
  ...
  procB obj
  Exit Sub
ErrHnd:
  MsgBox Err.Description, vbInformation, Me.caption
End Sub

Public Sub procB(ByRef rec As Object)
  On Error GoTo ErrHnd
  ... Exception occurs within DAO Recordset Operation
  Exit Sub
ErrHnd:
  Select Case Err.Number
  Case 3022
    Err.Raise vbObjectError + 9999, Err.Source, "Error Text"
  Case Else
    ...
  End Select
End Sub

我还尝试关闭 procB 中的异常处理(On Error Goto 0),但似乎 procA 从未收到异常。

感谢您的帮助。

编辑:附加信息:

  • 从 DAO.Recordset 对象引发异常。
  • 我还尝试在 procB 中完成删除异常处理,但没有任何效果。
  • procA 存在于另一个文件中,然后是 procB(data.cls、frmListArtikel.frm)。

解决方案:我不知道程序的执行方式会有所不同。如果我从 IDE 启动它,异常不会由 procA 处理。如果我从资源管理器中启动 EXE(之前是从 IDE 中创建的),异常会按照 procA 的要求进行处理。

【问题讨论】:

    标签: vb6 exception-handling


    【解决方案1】:

    您一次只能有一个活动的错误处理程序。如果你在 procb 中激活,procb 会处理。

    您可能还需要检查您的编辑器设置。选择选项“工具 > 选项 > 常规选项卡”“中断类模块”

    代码示例 1. 您将在 procA 中收到错误 6:

    Private Sub Form_Load()
        Call procA
    End Sub
    
    Private Sub procA()
        On Error GoTo errhan
        procB
        Exit Sub
    errhan:
        Debug.Print "proca handle"
    End Sub
    
    Private Sub procB()
        Err.Raise 6
    End Sub
    

    代码示例 2。您将在 procA 中收到错误 7:

    Private Sub Form_Load()
        Call procA
    End Sub
    
    Private Sub procA()
        On Error GoTo errhan
        procB
        Exit Sub
    errhan:
        Debug.Print "proca handle"
    End Sub
    
    Private Sub procB()
        On Error GoTo errhan
        Err.Raise 6
    errhan:
        Err.Raise 7
    End Sub
    

    【讨论】:

    • +1 这可能是解决方案;在我意识到没有设置此选项之前,我花了几个小时解决类似的问题。
    • +1 我还建议在问题中发布的原始代码中,在Err.Raise 之前使用On Error Goto 0。这确实意味着您需要将Err.Source 缓存在一个变量中,因为On Error Goto 0 会清除Err 对象。
    • 感谢您的回答,我删除了 procB 中的“On Error Goto ErrHnd”,并检查了“break in class module”。不幸的是,procA 仍然没有得到异常。在我的特殊情况下,它必须是别的东西。异常是否跨越模块边界(file1.frm、file2.frm)?
    • 是的,异常会跨越表单和模块。您应该在一个空项目中尝试我的示例并验证它是否有效。
    【解决方案2】:

    检查您的编辑器设置并选择“工具 > 选项 > 常规选项卡”“未处理错误中断”选项

    查看此链接:http://www.fmsinc.com/tpapers/vbacode/debug.asp

    【讨论】:

    • 感谢您提供这篇综合文章的链接。
    猜你喜欢
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多