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à come deallocazione della memoria, chiusura di file e rilascio di handle di file. L'istruzione try-finally è particolarmente utile per le routine con diverse posizioni in cui viene eseguito un controllo per un errore che potrebbe causare un ritorno prematuro dalla routine.

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

L'istruzione composta dopo la __try clausola è la sezione sorvegliata. L'istruzione composta dopo la __finally clausola è il gestore di terminazione. 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 un'esecuzione sequenziale semplice (fall-through). Quando il controllo entra nell'istruzione __try , il gestore associato diventa attivo. L'esecuzione procede come segue:

  1. Viene eseguita la sezione sorvegliata.

  2. Viene richiamato il gestore di terminazione.

  3. Al termine del gestore di terminazione, 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 __leave parola chiave è valida all'interno di un blocco di try-finally istruzioni. L'effetto di __leave è passare alla fine del try-finally blocco. Il gestore di terminazione viene eseguito immediatamente. Anche se un'istruzione goto può essere usata per ottenere lo stesso risultato, 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 tramite un'istruzione return o la longjmp funzione di runtime è considerata terminazione anomala. Non è legale saltare in una __try dichiarazione, ma legale per saltare fuori di uno. Tutte le __finally istruzioni attive tra il punto di partenza e la destinazione devono essere eseguite. Si chiama rimozione locale.

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

Annotazioni

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 C++ è molto più flessibile, in quanto può gestire le eccezioni di qualsiasi tipo. Per altre informazioni, vedere Gestione delle eccezioni nelle informazioni di riferimento sul linguaggio C++.

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

END Specifico di Microsoft

Vedere anche

try-finally istruzione (C++)