2009-09-04 16 views
17

Perché dovrei voler uscire da un gestore di errori (dopo il trattamento) con un Exit Sub invece di lasciarlo andare alla End Sub?Error Handler - Exit Sub End Sub vs.

sono sicuro è semplice. Io proprio non capisco. Grazie per qualsiasi aiuto.

Esempio:

Public Sub SubA() 
On Error Goto ProcError 

    ''# other code 
    MsgBox FuncA() 

ProcExit: 
    Exit Sub 

ProcError: 
    MsgBox Err.Description 
    Resume ProcExit 
End Sub 

risposta

22

L'etichetta ProcExit è il luogo in cui si rilasciano tutte le risorse sia che si sia verificato un errore. Ad esempio:

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. E, ovviamente, se non hai bisogno di chiudere o rilasciare alcuna risorsa, non ce n'è bisogno e puoi semplicemente passare a End Sub. – MarkJ

+0

@MarkJ: Questo è probabilmente Ok ma sarei a disagio con questo, se l'errore è veramente stato "gestito" Preferirei Riprendi per ProcExit anche se il suo immediatamente seguito con Exit Sub. – AnthonyWJones

+8

Questo non causerebbe un ciclo infinito se qualcosa sotto 'ProcExit' genera un errore? –

1

In genere se si dispone di connessioni al database o altri oggetti hanno dichiarato che, se usato in modo sicuro o creati prima del vostro eccezione, dovrà essere ripulito (ceduta), per poi tornare il vostro errore la gestione del codice al punto di ingresso ProcExit consentirà di eseguire la procedura di garbage collection in entrambi i casi.

Se si abbandona la procedura cadendo su Exit Sub, si rischia di avere uno schifoso accumulo di oggetti istanziati che sono semplicemente seduti nella memoria del programma.

+4

Scarsa scelta di parole. "Fai la tua raccolta dei rifiuti" e "stai seduto nella memoria del tuo programma". Questo potrebbe incoraggiare l'impostazione religiosa di tutti i riferimenti agli oggetti locali a Nothing alla fine della routine. In effetti, gli oggetti e la memoria saranno automaticamente eliminati dalla VB6 non appena il conteggio dei riferimenti sarà a zero. Se erano in variabili locali, ciò accade nel sottomenu Exit. Devi solo preoccuparti in relativamente pochi casi, dove le risorse speciali devono essere esplicitamente rilasciate o quando è necessario ripristinare un altro stato (ad esempio, cambiare il puntatore del mouse da clessidra). – MarkJ

+0

Punto giusto. Meglio rispolverare il mio VB6 suppongo. Sei stato troppo concentrato su linguaggi moderni, orientati agli oggetti ultimamente comunque ... –

+0

Puoi ancora aver bisogno di "ripulire", anche se oltrepassare semplicemente i riferimenti agli oggetti uscendo dal loro ambito. È possibile che tu stia conservando un riferimento a un server fuori processo che richiede una richiesta di arresto esplicito (ad esempio, Excel potrebbe essere in attesa di una chiamata di uscita). Oppure potresti voler rilasciare un riferimento dichiarato al di fuori dell'ambito della procedura all'uscita. – Bob77