Condividi tramite


sintassi Termination-Handler

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 di __finally non viene eseguito se si chiama una delle funzioni seguenti all'interno del blocco __try: ExitProcess, ExitThreado interrompere.

Il blocco __finally viene eseguito nel contesto della funzione in cui si trova il gestore di terminazione. Ciò significa che il blocco __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 control (restituire, interruzione, continuareo )
  • 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 al longjmp funzione della libreria di runtime C dal blocco di __try causa l'esecuzione del blocco __finally prima che l'esecuzione venga ripresa nella destinazione dell'operazione di longjmp. Se __try'esecuzione di blocchi termina a causa di un'istruzione di controllo (restituire, interrompere, continuareo ), 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 eccezioni o un restituire, interruzione, continuareo 'istruzione 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 terminazione immediata del blocco __try senza causare interruzioni anomale e la sua riduzione delle prestazioni. Controllare la documentazione del compilatore per determinare se l'istruzione __leave è supportata.

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