2014-01-15 55 views
0

我有一个类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.RaisedoSomethingElse会将错误提高到doSomething,但有时它只会停止执行,并显示运行时错误,就像doSomething没有On Error条件一样。 rs中的第一条记录通常会导致错误提升到doSomething,但第二条记录总是会导致运行时错误。有时第一个记录也会引发运行时错误。

doSomething的第一次迭代Do While循环之后发生了什么事情,该循环关闭了错误处理?

回答

0

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

当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 

一定要纪念这是正确的答案,如果你的作品。

+0

我把它移到循环中,但我得到了同样的结果:第一次工作,然后第二次通过循环我得到运行时错误,没有处理。 – sigil

+0

什么是错误? –

+0

这是用户定义的错误,我扔在'doSomethingElse()'。 – sigil

相关问题