2014-01-15 95 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

相關問題