【问题标题】:Err.Raise() is ignoring custom description and sourceErr.Raise() 忽略自定义描述和来源
【发布时间】: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 &lt; 0 Then Err.Raise vbObjectError + 1, "error source", "error description" Else pValue = v End If End Property Sub: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


【解决方案1】:

我遇到了同样的问题。我发现当显式键入错误引发类的实例时,行为发生了变化。因此,如果您将类的类型更改为变体,则应保留自定义错误消息:

Sub TestSub()
  Dim Example As Variant   'use Variant instead of Test to keep your custom error message
  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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    相关资源
    最近更新 更多