Condividi tramite


Sintassi del gestore di terminazione

Le parole chiave __try e __finally vengono usate per costruire un gestore di terminazione. Nell'esempio seguente viene illustrata la struttura di un gestore di terminazione.

__try 
{ 
    // guarded body of code 
 
} 
__finally 
{ 
    // __finally block 
 
}

Per esempi, vedere Uso di un gestore di terminazione.

Come per il gestore eccezioni, sia il blocco __try che il blocco __finally richiedono parentesi graffe ({}) e l'uso di un'istruzione goto per passare a uno dei due blocchi non è consentito .

Il blocco __try contiene il corpo sorvegliato del codice protetto dal gestore di terminazione. Una funzione può avere un numero qualsiasi di gestori di terminazione e questi blocchi di gestione della terminazione possono essere annidati all'interno della stessa funzione o in funzioni diverse.

Il blocco __finally viene eseguito ogni volta che il flusso del controllo esce dal blocco __try . Tuttavia, il blocco __finally non viene eseguito se si chiama una delle funzioni seguenti all'interno del blocco __try: ExitProcess, ExitThread o abort.

Il blocco __finally viene eseguito nel contesto della funzione in cui si trova il gestore di terminazione. Ciò significa che il blocco di __finally può accedere alle variabili locali della funzione. L'esecuzione del blocco __finally può terminare con uno dei mezzi seguenti.

  • Esecuzione dell'ultima istruzione nel blocco e nella continuazione all'istruzione successiva
  • Uso di un'istruzione di controllo (return, break, continue o goto)
  • Uso di longjmp o di un passaggio a un gestore eccezioni

Se l'esecuzione del blocco __try termina a causa di un'eccezione che richiama il blocco di gestione delle eccezioni di un gestore eccezioni basato su frame, il blocco __finally viene eseguito prima dell'esecuzione del blocco di gestione delle eccezioni. Analogamente, una chiamata alla funzione della libreria di runtime longjmp C dal blocco __try causa l'esecuzione del blocco __finally prima che l'esecuzione venga ripresa nella destinazione dell'operazione longjmp . Se __try'esecuzione di blocchi termina a causa di un'istruzione di controllo (return, break, continue o goto), viene eseguito il blocco __finally .

La funzione AbnormalTermination può essere usata all'interno del blocco __finally per determinare se il blocco __try termina in sequenza, ovvero se ha raggiunto la parentesi graffa di chiusura (}). Lasciare il blocco __try a causa di una chiamata a longjmp, un passaggio a un gestore di eccezioni o un'istruzione return, break, continue o goto , viene considerata una terminazione anomala. Si noti che l'errore di terminare in sequenza fa sì che il sistema esequisi tutti i frame dello stack in ordine inverso per determinare se è necessario chiamare i gestori di terminazione. Ciò può comportare una riduzione delle prestazioni a causa dell'esecuzione di centinaia di istruzioni.

Per evitare la terminazione anomala del gestore di terminazione, l'esecuzione deve continuare fino alla fine del blocco. È anche possibile eseguire l'istruzione __leave . L'istruzione __leave consente la chiusura immediata del blocco __try senza causare interruzioni anomale e la relativa riduzione delle prestazioni. Controllare la documentazione del compilatore per determinare se l'istruzione __leave è supportata.

Se l'esecuzione del blocco __finally termina a causa dell'istruzione del controllo restituito , equivale a un elemento goto alla parentesi graffa di chiusura nella funzione di inclusione. Pertanto, la funzione di inclusione restituirà .