如何从VBA中的函数返回错误对象?

时间:2017-10-13 21:02:52

标签: vba error-handling

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

要知道我是否可以这样做,我将以下内容混为一谈:

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然后意图是将整个错误对象传回去,因为我可以有一个自定义数字并填写我自己的描述等...

你如何实际传递错误的对象?你真的可以做到这一点,这是实现我要做的事情最有效的方式吗?

由于

1 个答案:

答案 0 :(得分:1)

你不是。 Err是标准库Function模块中的全局范围VBA.Information,它返回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无法创建对象"。

错误背后的想法(以及例外,如果您熟悉具有例外情况的语言),就是他们替换旧的#&strong> 34;返回状态代码"方式,例如:

''' 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语句通过将大多数错误处理问题排除在"快乐路径之外来简化代码。