2009-09-04 5 views
17

왜 End Sub로 보내지 않고 Exit Sub로 오류 처리기를 벗어나고 싶습니까?오류 처리기 - Exit Sub vs. End Sub

나는 그것이 간단하다고 확신합니다. 나는 이해하지 못한다. 어떤 도움을 주셔서 감사합니다.

예 : 일반적으로 당신은 데이터베이스 연결이나 다른 물체를 안전하게 사용하거나 예외 이전에 생성 여부 (처리) 청소해야합니다, 선언이있는 경우

Public Sub SubA() 
On Error Goto ProcError 

    ''# other code 
    MsgBox FuncA() 

ProcExit: 
    Exit Sub 

ProcError: 
    MsgBox Err.Description 
    Resume ProcExit 
End Sub 

답변

22

ProcExit 레이블은 오류가 발생했는지 여부와 관계없이 모든 리소스를 해제하는 곳입니다. 예 :

+1

+1. 그리고 분명히 리소스를 닫거나 해제 할 필요가 없다면 리소스가 필요 없으며 End Sub로 넘어갈 수 있습니다. – MarkJ

+0

@ MarkJ : 아마도 Ok입니다.하지만 오류가 진정으로 "처리"되었다면 Exit Sub가 바로 따라 오더라도 ProcExit으로 재시작하는 것을 선호합니다. – AnthonyWJones

+8

'ProcExit' 아래에 뭔가 오류가 발생하면 무한 루프가 발생하지 않습니까? –

1

, 다음 오류를 반환 ProcExit 진입 점으로 다시 코드를 처리하면 두 경우 모두 가비지 콜렉션을 수행 할 수 있습니다.

Exit Sub로 떨어 뜨려 프로 시저를 중단하면 프로그램 메모리에 앉아있는 인스턴스화 된 개체가 생겨날 수 있습니다.

+4

단어 선택이 잘못되었습니다. "당신의 쓰레기 수거를 처리하십시오"및 "귀하의 프로그램 메모리에 앉아 계십시오." 이것은 일상적으로 모든 로컬 객체 참조를 Nothing으로 설정하도록 권장 할 수 있습니다. 사실 객체와 메모리는 참조 카운트가 0이 되 자마자 VB6에 의해 자동으로 가비지 수집됩니다. 변수가 로컬 변수에 있으면 Exit Sub에서 발생합니다. 특수 리소스를 명시 적으로 릴리스해야하거나 다른 상태를 복원해야하는 경우 (예 : 모래 시계에서 마우스 포인터를 뒤로 이동) 등 비교적 적은 경우에만 걱정할 필요가 있습니다. – MarkJ

+0

공정한 포인트. 내 VB6에서 최고의 브러시 가정. 요즘에는 현대적이고 객체 지향적 인 재미있는 언어에 너무 집중되어 있습니다 ... –

+0

범위를 종료하여 단순히 객체 참조를 삭제하는 것 이상의 "정리"가 필요할 수도 있습니다. 명시 적 종료 요청이 필요한 프로세스가없는 서버에 대한 참조가있을 수 있습니다 (예 : Excel이 종료 통화를 기다리는 중일 수 있음). 또는 종료 할 때 프로 시저 자체의 범위 외부에서 선언 된 참조를 릴리스 할 수 있습니다. – Bob77