Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从VBA中的函数返回错误对象?_Vba_Error Handling - Fatal编程技术网

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

如何从VBA中的函数返回错误对象?,vba,error-handling,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

我有一个函数,其目的是返回一个字符串来表示函数已完成并检索到所需的值,或者返回一个错误来表示出现了问题

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

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
是标准库
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无法创建对象”

错误(以及异常,如果您熟悉具有异常功能的语言的话)背后的想法是,它们取代了旧式的“返回状态代码”,例如:

''' 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
在这种模式下,每个过程都是一个返回错误代码的
函数
;实际返回值作为
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
语句将大多数错误处理问题从“快乐路径”中剔除,从而简化了代码。

它不应该是
Err
two=Err
?请看这里:我认为在VBA中,您所能做的就是引发一个错误-您不能直接创建一个
Err
对象。您的
ErrObject
似乎是VB。Net@TimWilliams不,
ErrObject
绝对是VBA:
Err
是一个函数,是
VBA.Information
模块的成员,返回一个
ErrObject
。不能使用
New
关键字创建
ErrObject
类的实例。现在我知道了一些新的东西!