【发布时间】:2015-09-22 22:45:13
【问题描述】:
我有一个带有 Let 函数的类模块,该函数会引发自定义错误,示例如下所示
Private pValue As Double
Public Property Let Value(v As Double)
If v < 0 Then
Err.Raise vbObjectError + 1, "error source", "error description"
Else
pValue = v
End If
End Property
在另一个子程序中,我在对象(示例)上调用类函数并通过传递小于 0 的值引发错误。在同一个子程序中,我设置了错误处理以根据错误编号捕获多个错误。
Sub TestSub()
Dim Example As Test
Set Example = New Test
On Error GoTo errorHandler
Example.Value = -1
On Error GoTo 0
Exit Sub
errorHandler:
MsgBox Err.Number & "," & Err.Description & " in " & Err.Source
End Sub
消息框打印出正确的错误号,但描述是对象的泛型方法〜失败,来源是泛型VBAProject。我真的很想打印出我给 Err.Raise 的错误消息。有谁知道这里的问题是什么?我将错误处理设置为中断未处理的错误。
消息框中显示的消息是:
对象“_Test”的方法“值”失败
编辑:将代码更新为出现问题的完整场景
【问题讨论】:
-
无法使用等效设置进行复制。你的真实代码必须比上面的简化代码做更多的事情。可以展开吗?
-
我用以下代码复制了问题 Class:
Private pValue As Double Public Property Let Value(v As Double) If v < 0 Then Err.Raise vbObjectError + 1, "error source", "error description" Else pValue = v End If End PropertySub:Sub TestSub() Dim Example As Test Set Example = New Test On Error GoTo errorHandler Example.Value = -1 On Error GoTo 0 Exit SuberrorHandler: MsgBox Err.Description End Sub` -
那么奇怪-我将您的代码粘贴进去并按预期获得了“错误描述”文本。我还设置了未处理的错误集。我不知道什么会导致它在不同机器上的运行方式有所不同。你在 Windows 上吗?
-
不,我在 Mac 上。如果这是罪魁祸首,那似乎很奇怪,但肯定有可能。我无法在 Windows 上进行验证。如果我在与错误处理程序相同的 Sub 中引发错误,即:
Sub TestSub() On Error GoTo errorHandler Err.Raise vbObjectError + 1, "error source", "error description" Exit Sub errorHandler: MsgBox Err.Description End Sub然后 msgBox 显示“错误描述”问题来自在类模块中引发错误 -
@Bond,是的。我将其设置为在未处理的错误时中断。如果我切换到“类模块中的中断”,则会在出现错误时出现错误对话框,并带有调试按钮。传递给 Err.Raise 的错误描述消息显示在此框中。但是我希望避免这种形式的错误处理,因为它不会重定向到代码的指定错误处理部分。我假设 Err 对象是通过调用堆栈向下传递的,并且当从类模块传递到子例程时,它的属性将保持不变。
标签: vba error-handling