抛出异常时VBA中的错误处理不一致

时间:2014-01-15 00:53:28

标签: vba exception-handling

我有一个类c1,它调用另一个类c2的方法。我希望c2生成的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 捕获并处理,这会将错误的描述添加到集合中。相关功能的代码如下:

C1:

Public Sub doSomethingElse(someValue as string)  

If Not xyz(someValue) Then
    Err.Raise 516, "doSomethingElse", "xyz: " & someValue
Else
    DoOtherThings

End Sub

C2:

Err.Raise

当我将错误陷阱设置为“中断未处理的错误”时,有时doSomethingElse中的doSomething会将错误提升到doSomething,但有时它会暂停执行运行时错误,好像On Error没有rs条件。 doSomething中的第一条记录通常会导致错误提升到Do While,但第二条记录会导致运行时错误。有时第一条记录也会抛出运行时错误。

在我doSomething中{{1}}循环的第一次迭代后,是否会发生某些事情,从而关闭错误处理?

1 个答案:

答案 0 :(得分:0)

错误处理只会发生一次错误。

当rs.movenext通过循环发回例程时,错误将不再起作用。

在错误处理后放入Resume 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

如果适合您,请务必将此标记为正确答案。