VBA - 设计模式以在类中中断,同时仅中断未处理的错误

问题描述 投票:0回答:1

假设我有以下课程:

class Class1
  Sub error1(): Err.Raise 1, "", "Error1": End Sub
  Sub error2(): Err.Raise 1, "", "Error2": End Sub
end class

现在我有了这个模块:

Sub ErrorInClass()
  Dim c As New Class1
  
  'Raise a handled exception
  On Error Resume Next
    Call c.error1
  On Error GoTo 0
  
  'Raise an unhandled exception
  Call c.error2
End Sub

以下是一些观察结果:

  • 如果我使用“中断类模块”运行它 - 它将中断类内的运行时,并且会在 Error1 和 Error2 上中断;尽管 Error1 正在处理。
  • 如果我使用“Break on Unhandled Errors”来运行它 - 它将在类之外(在顶级模块中)中断运行时,但只会在 Error2 上中断。

有时我们在类中的类中包含类,中间有多个计算步骤,这样破坏模块就没有什么意义。所以我们可能会选择“闯入课堂模块”;但我们根本无法处理错误...解决这个问题的最佳 VBA 设计模式是什么?

vba error-handling
1个回答
0
投票

不确定目前最好的行动方案是什么。但我确实有一个想法是使用

OnErrorResumeNext
类标志:

class Class1
  Private LastErrorText as String
  Public OnErrorResumeNext as Boolean
  Public Property Get ErrorText() as String
    ErrorText = LastErrorText
  End Property
  Sub Error1()
    Call RaiseError("Error1")
  End Sub
  Sub Error2()
    Call RaiseError("Error2")
  End Sub
  Private Sub RaiseError(ByVal message as string)
    if OnErrorResumeNext then
      LastErrorText = message
    else
      Err.Raise vbObjectError, "Class1", message
    end if
  End Sub
end class

Sub ErrorInClass()
  Dim c As New Class1

  'Raise a handled exception
  c.OnErrorResumeNext = true
    Call c.error1
  c.OnErrorResumeNext = false
  'if needed check ErrorText
  Debug.Print "ERROR: " & c.ErrorText
  
  'Raise an unhandled exception
  Call c.error2
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.