【问题标题】: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】:
错误编号分为两类。
-
系统错误(数字 0–512)。您不能使用它们,因为它们是为系统保留的。
-
用户定义的错误(编号 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