如何协调不同模块中的错误编号,VBA中的类模块



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

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


我的一些担忧:如果类1和类2具有相同的错误编号(并且具有不同的描述(,这是一个问题吗?如果是,预防它的最佳做法是什么?(如果枚举在不同的模块中,那么我有一定的依赖关系。(感谢您的指导。

错误编号分为两类。

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

  2. 用户定义的错误(数字513–65535(。

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

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

例如:

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

这意味着您必须构建和维护一个自定义的错误列表,并根据情况提出适当的错误。例如,如果你期望1-10之间的输入,并且用户输入20,那么你应该提出你的自定义错误">越界";等

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

仔细阅读一下文档,它非常有帮助。

VBA错误引发

谢谢你的回答@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

最新更新