2009-09-04 13 views
17

Dlaczego miałbym chcieć wydostać się z modułu obsługi błędów (po obsłudze) za pomocą Exit Sub, zamiast po prostu pozwolić mu przejść do End Sub?Obsługa błędów - wyjście Sub vs. End Sub

Jestem pewien, że to proste. Po prostu nie rozumiem. Dzięki za pomoc.

Przykład:

Public Sub SubA() 
On Error Goto ProcError 

    ''# other code 
    MsgBox FuncA() 

ProcExit: 
    Exit Sub 

ProcError: 
    MsgBox Err.Description 
    Resume ProcExit 
End Sub 

Odpowiedz

22

Etykieta ProcExit to miejsce, w którym można zwolnić wszystkie zasoby, niezależnie od tego, czy wystąpił błąd, czy nie. Na przykład:

Public Sub SubA() 
    On Error Goto ProcError 

    Connection.Open 
    Open File for Writing 
    SomePreciousResource.GrabIt 

ProcExit: 
    Connection.Close 
    Connection = Nothing 
    Close File 
    SomePreciousResource.Release 

    Exit Sub 

ProcError: 
    MsgBox Err.Description 
    Resume ProcExit 
End Sub 
+1

+1. I oczywiście, jeśli nie musisz zamykać ani wydawać żadnych zasobów, nie ma takiej potrzeby i możesz po prostu przejść do End Sub. – MarkJ

+0

@MarkJ: Prawdopodobnie jest OK, ale nie byłbym z tym zadowolony. Jeśli błąd został naprawdę "obsłużony", wolałbym powrócić do ProcExit, nawet jeśli zaraz potem następuje Exit Sub. – AnthonyWJones

+8

Czy nie spowoduje to nieskończonej pętli, jeśli coś poniżej 'ProcExit' spowoduje błąd? –

1

Zazwyczaj, jeśli masz połączenia z bazą danych lub innych przedmiotów oświadczył, że czy bezpiecznie stosować lub utworzone przed swoim wyjątku, będą musiały być czyszczone (usuwane), a następnie powrót swój błąd obsługa kodu z powrotem do punktu wejścia do ProcExit pozwoli ci na wyrzucenie śmieci w obu przypadkach.

Jeśli zrezygnujesz z zabiegu, przechodząc do Exit Sub, możesz zaryzykować nagromadzenie się instancji obiektów znajdujących się w pamięci programu.

+4

Zły wybór słów. "Rób swoje śmieci" i "siedzieć w pamięci programu". Może to zachęcić do religijnego ustawiania wszystkich odwołań do obiektów lokalnych na Nic na końcu procedury. W rzeczywistości obiekty i pamięć zostaną automatycznie usunięte z pamięci przez VB6, gdy tylko licznik odniesie się do zera. Jeśli znajdowały się w zmiennych lokalnych, dzieje się to w Exit Sub. Trzeba się tylko martwić w stosunkowo niewielu przypadkach, gdy specjalne zasoby muszą zostać jawnie zwolnione lub gdy trzeba przywrócić inne wartości (np. Zmienić wskaźnik myszy z powrotem z klepsydry). – MarkJ

+0

Punkt targów. Najlepiej odświeżyć mój VB6 Przypuszczam. Byłem zbyt skoncentrowany na nowoczesnych, zorientowanych obiektowo, zabawnych językach ostatnio i tak ... –

+0

Nadal możesz potrzebować "sprzątania", ale poza porzucaniem referencji obiektów przez wychodzenie z ich zakresu. Możesz mieć odwołanie do serwera poza procesem, który wymaga jawnego żądania zamknięcia (np. Excel może oczekiwać na wywołanie Quit). Lub możesz zwolnić zadeklarowane odwołanie poza własnym zasięgiem procedury przy wyjściu. – Bob77