【问题标题】:How do you return an error object from a function in VBA?如何从 VBA 中的函数返回错误对象?
【发布时间】:2017-10-13 21:02:52
【问题描述】:

我有一个函数,其目的是返回一个字符串以表示该函数已完成并检索到所需的值,或者返回一个错误以表示存在问题。

为了看看我是否能做到这一点,我拼凑了以下内容:

Private Function one()

    Debug.Print TypeName(two(False))

End Function

Private Function two(b As Boolean) As Variant
    Dim e As New ErrObject

    If (b) Then
        two = True
    Else
        two = e.number
    End If

End Function

现在,two = e.number 失败了,因为您似乎无法以这种方式设置错误号 - 语法不正确。

我可以使用 err.raise 但是我的目的是将整个错误对象传回,因为我可以有一个自定义数字并填写我自己的描述等...

您实际上是如何将 err 对象传回的?你真的能做到吗?这是实现我打算做的最有效的方法吗?

谢谢

【问题讨论】:

  • 不应该只是Err吗? two = Err?
  • 我认为您在 VBA 中所能做的就是 Raise 一个错误 - 您不能直接创建 Err 对象 cpearson.com/Excel/ErrorHandling.htm。你的ErrObject 好像是VB.Net
  • @TimWilliams 不,ErrObject 绝对是 VBA:Err 是一个 函数,它是 VBA.Information 模块的成员,它返回一个 ErrObject。不能使用 New 关键字创建 ErrObject 类的实例。
  • 现在我知道了一些新东西!

标签: vba error-handling


【解决方案1】:

你没有。 Err 是标准库 VBA.Information 模块中的全局范围 Function,它返回一个 ErrObject 实例。

目的是将整个错误对象传回,因为我可以有一个自定义数字并填写我自己的描述

您无需将整个错误对象传回即可引发自定义错误。

Const ERR_SomethingBad = vbObjectError + 42
Err.Raise ERR_SomethingBad, "MyModule.MyProcedure", "Uh-oh"

Err 已经在全局范围内 - 你不需要传递错误对象......事实上,你根本不能。因为 ErrObject 类是不可创建的。这个:

Dim e As ErrObject
Set e = New ErrObject

引发运行时错误 429“ActiveX 无法创建对象”。

错误(和异常,如果您熟悉具有异常的语言的话)背后的想法是它们替换旧的“返回状态码” " 方式,例如:

''' DON'T DO THIS, IT's 2017!!!
Public Function DoSomething(ByVal p1 As Double, ByRef outResult As Double) As Long
    If p1 = 0 Then
        DoSomething = 11 'return code for division by zero error
        Exit Function
    End If
    outResult = 42 / p1
    DoSomething = 0 'return code for OK - everything went well!
End Function

在这种模式下,每个过程都是一个返回错误代码的Function;实际返回值作为ByRef/out 参数传递,调用者必须这样做才能信任结果:

Dim result As Double
Dim e As Long
e = DoSomething(42, result)
If e = 0 Then
    ' happy path
Else
    MsgBox Error$(e) ' error path
End If

On Error 语句将大多数错误处理问题排除在“快乐路径”之外,从而简化了代码。

【讨论】:

    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2015-12-15
    • 2022-11-07
    • 1970-01-01
    • 2021-07-20
    相关资源
    最近更新 更多