gpt4 book ai didi

class - 如何正确引发类里面的错误

转载 作者:行者123 更新时间:2023-12-03 08:23:27 24 4
gpt4 key购买 nike

我的问题是:如何正确地在类中引发错误,以便实例化该类的调用者可以使用适当的错误处理技术?

我正在升级不使用类的旧VB6意大利面条代码。过去,我总是使用 On Error Resume下一个 On Error Goto myLabel 来处理无法替代我的代码的错误。

但是,我无法让调用者处理错误,因为如果我在类的方法或属性中引发错误,则无论我是否使用 On Error 语句从调用者中捕获该错误,都会引发错误。示例代码如下所示:

我的课:

Public Sub Bar()
If valid Then
'some code here
Else
Err.Raise 5
End if
End Sub

MainForm:
Private Sub CallFoo()
Dim foo as New MyClass

On Error Goto fooliure 'Starts ignoring errors
Call foo.Bar() 'Program stops with an exception
On Error Goto 0 'Ends error handling

Exit Sub
fooliure:
'Error handling code
End Sub

微软还说,这就是他们希望在 here中提到的在VB 6.0中执行错误处理的方式。

此时,我正在考虑在我的类中使用一个对象,该对象将收集可由调用者检索的错误。如果我能避免那样做,我会的,但是到目前为止我没有运气找到答案。

最佳答案

大卫,这是有关VBA错误处理101的简短教程。

  • Err对象。这是一个包含当前错误的单例对象。请勿尝试实例化此对象(即,不要使用Set objErr = New Err-这将失败)
  • On Error-设置错误处理。可能的错误处理程序:
  • On Error GoTo Label-遇到错误时执行跳转到Label
  • On Error Resume Next-遇到错误时,执行跳至下一行
  • On Error GoTo 0-关闭当前的错误处理程序。任何后续错误将由调用方
  • 处理
  • On Error Resume-执行跳转到导致错误的行(不建议)
  • 在以下情况下,会清除Err对象(丢失当前错误):
  • 子例程,函数或属性称为
  • 子例程,函数或属性通常会退出
  • 执行On Error语句
  • Err.Clear在调用
  • 时清除当前错误
  • 引发异常。您随时可以提出错误。规范形式:
    Err.Raise 1001 + vbObjectError, Description:="An exception occurred."
  • 自定义错误:使用vbObjectError进行用户定义的错误。例:
  • 1001 + vbObjectError
  • 整数范围是0到65535
  • 错误处理顺序:
  • 如果例程中定义了本地错误处理程序,则执行
  • 如果没有本地处理程序,则向调用方
  • 引发错误
  • 如果调用方没有处理程序,则不断引发错误,直到找到本地处理程序为止
  • 如果没有顶级处理程序,则应用程序终止
  • 创建错误链。创建显示原始错误的错误链并在发生错误时在堆栈上显示例程列表非常有用。去做这个:
  • 向每个例程添加错误处理,这可能会导致错误
  • 始终将错误重新引发给调用方
  • 重新引发错误
  • 时,将字符串添加到 Err.Source中以命名例程
  • 顶层调用例程可以使用MsgBox通知用户错误(或可以实现其他日志记录)

  • 这是一个演示这些想法的代码示例:
    Public Sub TestErrorLevel1()

    On Error GoTo HandleErr ' clears Err object

    TestErrorLevel2

    Exit Sub

    HandleErr:
    ' top-level error handler -- nothing else to raise error to
    ' show error and complete call chain
    MsgBox "Error: " & Err.Number & vbCrLf & Err.Description & vbCrLf _
    & "Source: modTest.TestErrorLevel1" & vbCrLf & Err.Source
    End Sub

    Public Sub TestErrorLevel2()

    On Error GoTo HandleErr ' clears Err object

    TestErrorLevel3

    Exit Sub

    HandleErr:
    ' re-raise error, adding this subroutine to call chain
    Err.Raise Err.Number, "modTest.TestErrorLevel2" & vbCrLf & Err.Source, Err.Description
    End Sub

    Public Sub TestErrorLevel3()

    On Error GoTo HandleErr ' clears Err object

    Err.Raise 1001 + vbObjectError, Description:="User-defined error. Offset range from 0 to 65535"

    Exit Sub

    HandleErr:
    ' re-raise: add module and routine to originating error
    Err.Raise Err.Number, "modTest.TestErrorLevel3" & vbCrLf & Err.Source, Err.Description
    End Sub

    关于class - 如何正确引发类里面的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50711866/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com