2010-06-08 3 views
13

다음 예에서 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 레이블로 전송됩니다. 지금까지 내가 기억하는 한, 유일한 차이는 Err 개체를 삭제하지 않습니다 Goto를 사용

  • 이 있고 그것은 당신의 오류 처리기가 비활성화 잎 (당신이 Goto를 사용하는 경우 너무 Err.Clear이 필요합니다). Cleanup 레이블 뒤에 오류가 발생하면 ErrorHandler에서 처리되지 않습니다.
  • Resume을 사용하면 Err 개체가 지워지고 오류 처리기가 다시 켜집니다 (오류 처리 중에는 사용할 수 없습니다). 오류가 Cleanup lable가 이후에 발생하는 경우는 이러한 차이를 설명하지 않습니다 ErroHandler

VB6 manual entry for the Resume statement에서 처리됩니다.

+0

건배 MarkJ,이 답변에서 많이 배우지 마십시오. –

+1

테스트를하는 동안 CleanUp에서 오류가 발생하면 오류 루프가 ErrorHandler와 CleanUp 블록간에 튀어 오르는 존재하는 것으로 나타났습니다. 따라서 Cleanup에서 On Error Resume Next를 사용하는 것이 좋습니다. –

+0

@ 리치 올리버 예, 그게 내가하는 일입니다. 이 질문은 http://stackoverflow.com/questions/536379/how-do-you-handle-errors-in-error-handlers-in-vb6에서 확인하거나 'vb6'및 ' error-handling' http://stackoverflow.com/questions/tagged?tagnames=vb6%2berror-handling&sort=votes&pagesize=15 – MarkJ

2

이것은 큰 오해입니다! 사이의 중요한 차이가 있습니다 :

Err.Clear 
GoTo CleanUp 

과 :

Resume CleanUp 

항상 다시 시작 정리를 사용하여 첫 번째 양식을 사용하지 마십시오 (만)가. 이력서는 내부 VB6 오류 상태의 RESET을 수행하므로 다른 오류가 발생하면 "On Error GoTo Label"이 적용됩니다. "Err.Clear"를 사용하면 Err 객체가 지워지지 만 내부 오류 상태는 지워지지 않고 다른 오류가 발생하면 예외 핸들러가없는 코드로 간주되어 함수 외부로 throw됩니다. 당신은

이 코드 고려 "오류 고토 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"으로 바꾸면 "ERROR!"가 실행되지 않습니다. 라인 및 코드는 "L2"레이블로 점프하고 "MsgBox Err"를 제공합니다.