如何从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
类的实例。现在我知道了一些新的东西!