try-finally istruzione

Specifici di Microsoft

La sintassi seguente viene descritto try-finally istruzione:

__try {
   // guarded code
}
__finally {
   // termination code
}

Grammatica

  • prova-finale-rendiconto:
    __try* composto-rendiconto*

    __finally* composto-rendiconto*

try-finally l'istruzione è un'estensione Microsoft ai linguaggi e C++ che consente alle applicazioni di destinazione garantire l'esecuzione del codice di pulitura quando l'esecuzione di un blocco di codice viene interrotta.La pulizia è costituito da tali attività come il rilascio della memoria, la chiusura dei file e rilasciando handle di file.try-finally l'istruzione è particolarmente utile per le routine che presentano vari punti in cui un controllo viene eseguito per un errore che potrebbe causare un ritorno prematuro dalla routine.

Per informazioni correlate e un esempio, vedere try-except l'istruzione.Per ulteriori informazioni sulla gestione delle eccezioni strutturata vedere in genere Gestione delle eccezioni strutturata.Per ulteriori informazioni sulla gestione delle eccezioni nelle applicazioni gestite, vedere Gestione delle eccezioni in /clr.

[!NOTA]

Attività di gestione delle eccezioni strutturata con le API Win32 sia per i file di origine in c e C++.Tuttavia, in particolare non è progettata per C++.È possibile assicurarsi che il codice è più portabile tramite la gestione delle eccezioni C++.Inoltre, la gestione delle eccezioni C++ è più flessibile, in quanto può gestire le eccezioni di qualsiasi tipo.Per i programmi C++, si consiglia di utilizzare il meccanismo di gestione delle eccezioni C++ (prova, rilevare e generano istruzioni).

L'istruzione composto dopo __try la clausola rappresenta la sezione accessibile.L'istruzione composto dopo __finally la clausola è il gestore di terminazione.Il gestore specifica un insieme di azioni da eseguire quando la sezione accessibile è uscita, indipendentemente dal fatto che la sezione accessibile è disconnesso da un'eccezione (anomala), o dal passaggio standard (terminazione normale).

Il controllo raggiunge un oggetto __try istruzione dall'esecuzione sequenziale semplice (passaggio).Quando il controllo passa in __try, il relativo gestore associato diventa attivo.Se il flusso di controllo raggiunge la fine del blocco try, l'esecuzione continua come segue:

  1. Il gestore di terminazione viene richiamato.

  2. Quando il gestore di terminazione completa, l'esecuzione continuerà a __finally istruzione.Indipendentemente dalla sezione accessibile termina, ad esempio tramite un oggetto goto dal corpo o da un custodetto return l'istruzione), il gestore di terminazione viene eseguito before il flusso di controllo si sposta dalla sezione accessibile.

    In __finally l'istruzione non blocca la ricerca di un gestore di eccezioni appropriato.

Se si verifica un'eccezione in __try il blocco, il sistema operativo deve trovare un gestore per l'eccezione o il programma non riuscirà.Se un gestore viene trovato, qualsiasi __finally i blocchi vengono eseguiti e riprende di esecuzione nel gestore.

Ad esempio, si supponga che una serie di funzione Ai collegamenti di chiamate di funzione per utilizzare D, come illustrato nella figura seguente.ogni funzione ha un gestore di terminazione.Se viene generata un'eccezione nella funzione D ed è gestita in un oggetto, i gestori di terminazione vengono chiamati in questo ordine mentre il sistema rimuove lo stack: D, C, B.

Ordine di esecuzione del gestore di terminazione

Terminazione dell'ordine di esecuzione di un gestore

[!NOTA]

Il comportamento di try-finally è diverso da altri linguaggi di che supportano l'utilizzo infine, ad esempio c#.un singolo __try può disporre di uno, ma non entrambi, __finally e __except.Se entrambi devono essere utilizzati insieme, un esterno try-except l'istruzione necessario racchiudere try-finally l'istruzione interno.Le regole che specificano quando ogni blocco esegue sono diversi.

La parola chiave __leave

__leave la parola chiave è valida solo all'interno della sezione accessibile di un oggetto try-finally l'istruzione e l'effetto è passare alla fine della sezione accessibile.L'esecuzione continua alla prima istruzione nel gestore di terminazione.

In goto l'istruzione inoltre possibile ignorare la sezione accessibile, ma comporta una riduzione delle prestazioni perché richiama la rimozione dello stack.__leave l'istruzione è più efficiente perché non provoca la rimozione dello stack.

Terminazione anomala

Uscire da a try-finally istruzione utilizzando il longjmp la funzione in runtime viene considerata anomala.Non è consentito passare a __try istruzione, ma valido uscire da uno.tutti __finally istruzioni attive tra il punto iniziale (terminazione normale di l __try blocco) e la destinazione ( __except bloccare che gestisce l'eccezione) deve essere eseguito.Questo processo è detto rimozione locale.

se a prova il blocco in anticipo viene terminato per qualunque ragione, incluso un salto dal blocco, il sistema esegue l'oggetto associato infine blocco come parte del processo di rimozione dello stack.in tali casi, AbnormalTermination TRUE della funzione restituisce se viene chiamato dal infine blocco; in caso contrario, restituisce FALSE.

Il gestore di terminazione non viene chiamato se un processo venga arrestato nel mezzo di eseguire un oggetto try-finally istruzione.

Microsoft FINALE specifico

Vedere anche

Riferimenti

Scrittura di un gestore di terminazione

Gestione delle eccezioni strutturata (C++)

Parole chiave C++

Termination-Handler Syntax