2010-06-08 82 views
13

我知道在下面的例子中應該使用Resume語句來代替Goto語句。錯誤處理模塊中的Resume和Goto之間的區別

Sub Method() 
    On Error Goto ErrorHandler 
    ... 
CleanUp: 
    ... 
    Exit Function 

ErrorHandler: 
    Log error etc 

    Err.Clear 'Is this line actually necessary?' 

    Resume CleanUp 'SHOULD USE THIS' 
    Goto CleanUp 'SHOULD NOT USE THIS' 
End Sub 

我的問題是兩者的執行有什麼不同?

回答

21

兩者都執行到Cleanup標籤。至於我記得,唯一的區別是

  • 使用Goto不清除Err對象,這會使你的錯誤處理程序禁用(所以如果你使用GotoErr.Clear是必要的)。如果在Cleanup標籤後發生錯誤,則不會在ErrorHandler處理。
  • 使用Resume清除Err對象,它將您的錯誤處理程序重新打開(它在處理錯誤時被禁用)。如果Cleanup拉布勒後發生錯誤,它會在ErroHandler

的VB6 manual entry for the Resume statement處理並不能解釋這些差異。

+0

乾杯MarkJ,從這個答案中學到很多東西。 – 2010-06-08 11:19:22

+1

雖然測試我發現,如果在清理中出現錯誤,將會在ErrorHandler和CleanUp塊之間彈跳一個infinte循環。 因此推薦的技術是在CleanUp中具有On Error Resume Next? – 2010-06-08 13:55:43

+0

@ Rich Oliver是的,這就是我所做的。看看這個問題http://stackoverflow.com/questions/536379/how-do-you-handle-errors-in-error-handlers-in-vb6甚至有一個看看標籤'vb6'和'錯誤處理'http://stackoverflow.com/questions/tagged?tagnames=vb6%2berror-handling&sort=votes&pagesize=15 – MarkJ 2010-06-08 16:20:03

2

這是很大的誤解! 有之間重要的不同:

Err.Clear 
GoTo CleanUp 

和:

Resume CleanUp 

NEVER使用第一形式中,始終使用恢復清理(只)。 繼續執行內部VB6錯誤狀態的RESET,所以當發生OTHER錯誤時,將應用「On Error GoTo Label」。我使用「Err.Clear」Err對象被清除,但內部錯誤狀態不被清除,並且當另一個錯誤發生時,它被認爲是代碼沒有任何異常處理程序並拋出函數外。您無法使用修復它「對錯誤轉到Label2的」

考慮以下代碼:「ERROR」

Public Sub Test() 
On Error GoTo L1 
MsgBox 0/(1 - 1) 
Exit Sub 

L1: 
    Err.Clear 
L0: 
    On Error GoTo L2 
    MsgBox 0/(1 - 1) 'ERROR! 
    Exit Sub 

L2: 
    MsgBox Err 
End Sub 

如果你運行它,它會中斷對線。 如果將「Err.Clear」替換爲「Resume L0」,則執行不會在「錯誤!」中中斷。行和代碼跳轉到「L2」標籤並提供「MsgBox Err」

相關問題