在抛出异常时VBA中的错误处理不一致
问题描述:
我有一个类c1
,它调用另一个类c2
的方法。我想要c2
生成的错误被c1
捕获和处理,这会将错误的描述添加到集合中。代码相关的功能如下:在抛出异常时VBA中的错误处理不一致
C1:
Private Function doSomething(ByRef rs As DAO.Recordset) As Collection
Dim errors as Collection
Set errors = New Collection
On Error GoTo logError
Do While Not rs.EOF
c2.doSomethingElse rs!someValue
GoTo continueLoop
logError:
errors.Add (Err.Description)
continueLoop:
rs.MoveNext
Loop
Set doSomething = errors
End Function
C2:
Public Sub doSomethingElse(someValue as string)
If Not xyz(someValue) Then
Err.Raise 516, "doSomethingElse", "xyz: " & someValue
Else
DoOtherThings
End Sub
当我设置错误捕获到 “处理错误破发”,有时Err.Raise
在doSomethingElse
会将错误提高到doSomething
,但有时它只会停止执行,并显示运行时错误,就像doSomething
没有On Error
条件一样。 rs
中的第一条记录通常会导致错误提升到doSomething
,但第二条记录总是会导致运行时错误。有时第一个记录也会引发运行时错误。
在doSomething
的第一次迭代Do While
循环之后发生了什么事情,该循环关闭了错误处理?
答
错误处理只会发生一个错误。
当rs.movenext通过循环返回例程时,错误将不再起作用。
在您的错误处理后放置继续continueLoop。 以下代码适用于我。
Private Sub Command1_Click()
doSomething
End Sub
Private Function doSomething() As Collection
Dim errors As Collection
Set errors = New Collection
On Error GoTo logError
Do
doSomethingElse ("someValue")
GoTo continueLoop
logError:
errors.Add (Err.Description)
Resume continueLoop
continueLoop:
Loop
Set doSomething = errors
End Function
Public Sub doSomethingElse(someValue As String)
Err.Raise 516, "doSomethingElse", "xyz: " & someValue
End Sub
一定要纪念这是正确的答案,如果你的作品。
我把它移到循环中,但我得到了同样的结果:第一次工作,然后第二次通过循环我得到运行时错误,没有处理。 – sigil
什么是错误? –
这是用户定义的错误,我扔在'doSomethingElse()'。 – sigil