Condividi tramite


Istruzione try-finally (C)

Specifico di Microsoft

L'istruzione try-finally è un'estensione Microsoft del linguaggio C che consente alle applicazioni di garantire l'esecuzione del codice di pulizia quando l'esecuzione di un blocco di codice viene interrotta. La pulizia è costituita da attività quali la deallocazione della memoria, la chiusura dei file e il rilascio di handle di file. L'istruzione try-finally è particolarmente utile per le routine che presentano vari punti in cui viene eseguito un controllo per verificare la presenza di un errore che potrebbe causare la restituzione prematura dalla routine.

try-finally-statement:
__try compound-statement __finally compound-statement

L'istruzione composta dopo la clausola __try è la sezione protetta. L'istruzione composta dopo la clausola __finally è il gestore terminazioni. Il gestore specifica un set di azioni eseguite quando la sezione sorvegliata viene chiusa. Non importa se la sezione sorvegliata viene chiusa da un'eccezione (terminazione anomala) o da standard fall through (terminazione normale).

Il controllo raggiunge un'istruzione __try tramite l'esecuzione sequenziale semplice (passaggio). Quando il controllo entra nell'istruzione __try, il relativo gestore associato diventa attivo. L'esecuzione procede nel modo seguente:

  1. La sezione protetta viene eseguita.

  2. Il gestore terminazioni viene richiamato.

  3. Al termine dell'esecuzione del gestore terminazioni, l'esecuzione continua dopo l'istruzione __finally. Indipendentemente dal modo in cui la sezione sorvegliata termina (ad esempio, tramite un'istruzione goto fuori dal corpo sorvegliato o tramite un'istruzione return ), il gestore di terminazione viene eseguito prima che il flusso di controllo si muova fuori dalla sezione sorvegliata.

La parola chiave __leave è valida all'interno di un blocco di istruzioni try-finally. L'effetto di __leave è il passaggio alla fine del blocco try-finally. Il gestore terminazioni viene eseguito immediatamente. Sebbene per ottenere lo stesso risultato possa essere utilizzata un'istruzione goto, un'istruzione goto causa la rimozione dello stack. L'istruzione __leave è più efficiente perché non comporta la rimozione dello stack.

L'uscita da un'istruzione try-finally mediante una funzione return o una funzione di runtime longjmp viene considerata una terminazione anomala. Non è legale saltare in una __try dichiarazione, ma legale per saltare fuori di uno. Devono essere eseguite tutte le istruzioni __finally attive tra il punto di origine e il punto di destinazione. Si chiama rimozione locale.

Il gestore di terminazione non viene chiamato se un processo viene terminato durante l'esecuzione di un'istruzione try-finally .

Nota

La gestione strutturata delle eccezioni funziona con i file di origine C e C++. Tuttavia, non è progettato specificamente per C++. Per i programmi C++ portatili, è consigliabile usare la gestione delle eccezioni C++ anziché la gestione strutturata delle eccezioni. Inoltre, il meccanismo di gestione delle eccezioni di C++ è molto più flessibile, in quanto è in grado di gestire eccezioni di qualsiasi tipo. Per altre informazioni, vedere Gestione delle eccezioni nelle informazioni di riferimento sul linguaggio C++.

Vedere l'esempio per l'istruzione try-except per vedere il funzionamento dell'istruzionetry-finally.

END Specifico di Microsoft

Vedi anche

try-finally istruzione (C++)