如何使对象的属性引发用户定义的运行时致命错误?

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

如果传递的参数不在可接受的值范围内,我需要对象的“Let”属性来引发用户定义的运行时错误(由我定义的编号和描述)。

我提出了错误,但我无法让错误包含我定义的编号和描述。

' Class Module: myPerson

Private m_Age As Integer

Property Let Age(yearsOld As Integer)

If yearsOld >= 0 Then
    m_Age = yearsOld
Else
    Err.Clear 'Make sure we start from a clean slate
    Err.Raise Number:=vbObjectError + 513, Source:="Book1.myPerson.LetAge", Description:="Positive integer required"
End If
    
End Property

Property Get Age() As Integer
    Age = m_Age
End Property

'Normal Module 1

Sub use_myPersonClass()

    Dim aPerson As myPerson
    
    Set aPerson = New myPerson
    
    aPerson.Age = -1 'Raises a runtime error but not my user-defined runtime error

End Sub

我不明白为什么表达式“vbObjectError + 513”,将513添加到-2147221504,会方便地有助于我个人错误号的定义,但我不在乎。我只是按照文档进行操作。

我的主要问题是我没有得到我个人对错误的描述。

使用 Excel for Mac 16.78.3 我明白了

enter image description here

excel vba macos
2个回答
1
投票

在正常的模块代码中应用此解决方法。


'Normal Module 1

Sub use_myPersonClass()

    Dim aPerson As myPerson

    Set aPerson = New myPerson
    On Error Resume Next
    aPerson.Age = -1 'Raises a runtime error but not my user-defined runtime error
    If Err <> 0 Then
        MsgBox "Error:  " & Err.Number - vbObjectError & Chr(10) & Err.Description, , Err.Source
    End If
    On Error GoTo 0
    

End Sub

有关 Err.Raise 的更多详细信息

此方法仅在标准模块中才能完全发挥作用。

这是 Err.Raise 方法在标准模块中时的结果。

enter image description here

在所有其他模块(类、表)中,错误。对象参数填充了分配的值,但错误生成的消息不反映它们。

但是,分配的值存储在 Err 对象中,并且代码片段显示所有分配的值都在 Class 模块的命令中声明,并且可以通过 Err 对象属性来实现。

Description
参数未反映在错误消息中,仅供参考,可以通过 Err.Description 获取。

如果将相同的命令放置在标准模块之外的另一个模块中,则错误消息仅反映错误的正确编号(用户定义)和一些其他描述(内置)。这就是你所经历的。 确实这不太好。

建议使用 vbObjectError 常量作为用户定义错误的基础,以避免引用内置错误代码。


1
投票

由于使用对象的例程不应该负责检测该对象不喜欢它的使用方式,因此我建议在上面黑猫的贡献的基础上,解决我在以下方式:

' Class Module: myPerson

Private m_Age As Integer

Property Let Age(yearsOld As Integer)

If yearsOld >= 0 Then
        m_Age = yearsOld
Else
        MsgBox ("Object myPerson Property Let Age : invalid parameter, positive integer required")
        'This message to compensate for the VBA limitation documented below
        Err.Raise Number:=vbObjectError + 513, Source:="Book1.myPerson.LetAge", Description:="Positive integer required" 'Fatal runtime error raised
        'Limitation of VBA (on macOS ?) : none of the properties of the Err object specified above is displayed correctly
End If

End Property

Property Get Age() As Integer
    Age = m_Age
End Property

'Normal Module 1

Sub use_myPersonClass()

    Dim aPerson As myPerson
    
    Set aPerson = New myPerson
    
    aPerson.Age = -1 'Raises a runtime error

End Sub

干杯,

努诺夫

© www.soinside.com 2019 - 2024. All rights reserved.