我有一个函数,其目的是返回一个字符串以表示该函数已完成并检索所需的值或错误以指示存在问题。
要知道我是否可以这样做,我将以下内容混为一谈:
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然后意图是将整个错误对象传回去,因为我可以有一个自定义数字并填写我自己的描述等...
你如何实际传递错误的对象?你真的可以做到这一点,这是实现我要做的事情最有效的方式吗?
由于
答案 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
语句通过将大多数错误处理问题排除在"快乐路径之外来简化代码。