【问题标题】:How to coordinate err.number in different modules, class modules in VBA如何协调不同模块中的err.number,VBA中的类模块
【发布时间】:2020-09-01 07:27:06
【问题描述】:

我正在编写我最大的 VBA (Excel) 项目。它包括几个类、模块。其中一些有错误处理,引发错误。如何协调错误编号?

现在我在所有此类模块中都有一个独立的错误值枚举。我搜索了如何在项目级别上协调这些数字。 到目前为止我发现的是 Err.Number=vbObjectError + 513 + xxx,但如果它是否是唯一的,则什么都没有。恐怕我在这里错过了什么。


我的一些担忧: 如果 class1 和 class2 具有相同的 Err.Number (并且具有不同的描述),这是否有问题? 如果是这样,那么防止它的最佳做法是什么? (如果枚举在不同的模块中,那么我有一定的依赖性。) 感谢您的指导。

【问题讨论】:

    标签: vba error-handling module


    【解决方案1】:

    错误编号分为两类。

    1. 系统错误(数字 0–512)。您不能使用它们,因为它们是为系统保留的。

    2. 用户定义的错误(编号 513–65535)。

    Visual Basic 错误(Visual Basic 定义的和用户定义的错误)在 0–65535 范围内。 0-512 范围是为系统错误保留的; 513–65535 范围可用于用户定义的错误。

    因此每个错误编号(及其描述)必须是唯一的,对应一个错误。

    例如:

    • 错误号:1001,描述:正在下雨。
    • 错误号:1002,描述:下雪了。

    这意味着您必须构建和维护自定义错误列表,并根据情况提出适当的错误。例如,如果您希望输入介于 1-10 之间,而用户输入 20,您应该提出自定义错误“Out of bounds”等。

    最后,错误处理是应用程序的重要组成部分,所以不要担心依赖关系。 VBA 附带一个Err 对象来处理错误。所以是的,它依赖于它,但它需要它;它是库的一部分,它的工作是处理错误。

    阅读文档,很有帮助。

    VBA Error Raise

    【讨论】:

      【解决方案2】:

      感谢@Kostas K 的回答。我也研究了这个:https://chejunkie.com/knowledge-base/application-error-class-vba/#Download
      我想出了一种组织错误编号和消息的可能性。 我编写了一个简化的系统来演示解决方案。共有三个类:class1、class2、class3。
      我处理错误号和消息的解决方案是包含一个模块,该模块的代码具有错误号的枚举。这些数字连接(链接)在一起,确保数字是唯一且连续的。
      它还有一个用于返回错误描述的公共函数。它提供了集中处理它们的优势。

      Option Explicit
      Option Private Module
      
      Public Enum ErrClass1
          [_First] = vbObjectError + 513
          InitialisationFailed = [_First]
          WrongID
          [_LastPlus1]
          [_Last] = [_LastPlus1] - 1
      End Enum
      
      Public Enum ErrClass2
          [_First] = ErrClass1.[_LastPlus1]
          InitialisationFailed = [_First]
          InvalideIndex
          [_LastPlus1]
          [_Last] = [_LastPlus1] - 1
      End Enum
      
      Public Enum ErrClass3
          [_First] = ErrClass2.[_LastPlus1]
          WrongClass = [_First]
          CreationFromRangeFailed
          [_LastPlus1]
          [_Last] = [_LastPlus1] - 1
      End Enum
      
      Function GetErrDescription(errorNumber As Long) As String
          Select Case errorNumber
              'Class 1
              Case ErrClass1.InitialisationFailed
                  GetErrDescription = "Initialisation failed. Is there a Database present?"
              Case ErrClass1.WrongID
                  GetErrDescription = "ID is missing."
              'Class 2
              Case ErrClass2.InitialisationFailed
                  GetErrDescription = "Initialisation failed. Chech for missing input!"
              Case ErrClass2.InvalideIndex
                  GetErrDescription = "Index outside range."
              'Class 3
              Case ErrClass3.WrongClass
                  GetErrDescription = "Class does not match with the Standars"
              Case ErrClass3.CreationFromRangeFailed
                  GetErrDescription = "Input range is wrong or data missing from the range"
              
              Case Else
                  GetErrDescription = "Undefined Error."
          End Select
      End Function
      

      此外,我在这里复制了两个测试子:测试如何引发错误并循环遍历所有错误号。我会感谢任何人发表评论和改进它。

      Private Sub testRaiseError()
          Err.Raise Number:=ErrClass1.InitialisationFailed, _
              Source:="Test testRaiseError", _
              Description:=GetErrDescription(ErrClass1.InitialisationFailed)
      End Sub
      
      'Looping through all error numbers and printing the error messages
      Private Sub testErrorEnumAndMessages()
          Dim i As Long
          For i = ErrClass1.[_First] To ErrClass3.[_Last]
              Debug.Print GetErrDescription(i)
          Next i
      End Sub
      

      【讨论】:

        猜你喜欢
        • 2011-02-17
        • 2020-07-28
        • 2020-02-22
        • 2018-06-30
        • 1970-01-01
        • 2015-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多