Istruzione try-finally (C)try-finally Statement (C)

Sezione specifica MicrosoftMicrosoft Specific

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.The try-finally statement is a Microsoft extension to the C language that enables applications to guarantee execution of cleanup code when execution of a block of code is interrupted. La pulizia è costituita da attività quali la deallocazione della memoria, la chiusura dei file e il rilascio di handle di file.Cleanup consists of such tasks as deallocating memory, closing files, and releasing file handles. 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.The try-finally statement is especially useful for routines that have several places where a check is made for an error that could cause premature return from the routine.

try-finally-statement:try-finally-statement:
__try compound-statement__try compound-statement

__finally compound-statement__finally compound-statement

L'istruzione composta dopo la clausola __try è la sezione protetta.The compound statement after the __try clause is the guarded section. L'istruzione composta dopo la clausola __finally è il gestore terminazioni.The compound statement after the __finally clause is the termination handler. Il gestore specifica un set di azioni che vengono eseguite quando la sezione protetta viene terminata, indipendentemente dal fatto che tale terminazione avvenga tramite un'eccezione (terminazione anomala) o un passaggio standard (terminazione normale).The handler specifies a set of actions that execute when the guarded section is exited, whether the guarded section is exited by an exception (abnormal termination) or by standard fall through (normal termination).

Il controllo raggiunge un'istruzione __try tramite l'esecuzione sequenziale semplice (passaggio).Control reaches a __try statement by simple sequential execution (fall through). Quando il controllo entra nell'istruzione __try, il relativo gestore associato diventa attivo.When control enters the __try statement, its associated handler becomes active. L'esecuzione procede nel modo seguente:Execution proceeds as follows:

  1. La sezione protetta viene eseguita.The guarded section is executed.

  2. Il gestore terminazioni viene richiamato.The termination handler is invoked.

  3. Al termine dell'esecuzione del gestore terminazioni, l'esecuzione continua dopo l'istruzione __finally.When the termination handler completes, execution continues after the __finally statement. Indipendentemente dal modo in cui la sezione protetta viene terminata (ad esempio tramite un'istruzione goto all'esterno del corpo protetto o un'istruzione return), il gestore terminazioni viene eseguito prima che il flusso di controllo venga spostato all'esterno della sezione protetta.Regardless of how the guarded section ends (for example, via a goto statement out of the guarded body or via a return statement), the termination handler is executed before the flow of control moves out of the guarded section.

    La parola chiave __leave è valida all'interno di un blocco di istruzioni try-finally.The __leave keyword is valid within a try-finally statement block. L'effetto di __leave è il passaggio alla fine del blocco try-finally.The effect of __leave is to jump to the end of the try-finally block. Il gestore terminazioni viene eseguito immediatamente.The termination handler is immediately executed. Sebbene per ottenere lo stesso risultato possa essere utilizzata un'istruzione goto, un'istruzione goto causa la rimozione dello stack.Although a goto statement can be used to accomplish the same result, a goto statement causes stack unwinding. L'istruzione __leave è più efficiente perché non comporta la rimozione dello stack.The __leave statement is more efficient because it does not involve stack unwinding.

    L'uscita da un'istruzione try-finally mediante una funzione return o una funzione di runtime longjmp viene considerata una terminazione anomala.Exiting a try-finally statement using a return statement or the longjmp run-time function is considered abnormal termination. Il passaggio a un'istruzione __try non è un'operazione valida, mentre uscire da un'istruzione è consentito.It is illegal to jump into a __try statement, but legal to jump out of one. Devono essere eseguite tutte le istruzioni __finally attive tra il punto di origine e il punto di destinazione.All __finally statements that are active between the point of departure and the destination must be run. Questo procedimento è denominato "rimozione locale."This is called a "local unwind."

    Il gestore terminazioni non viene chiamato se un processo viene terminato durante l'esecuzione di un'istruzione try-finally.The termination handler is not called if a process is killed while executing a try-finally statement.

Nota

La gestione strutturata delle eccezioni funziona con i file di origine C e C++.Structured exception handling works with C and C++ source files. Tuttavia, non è progettato in particolare per C++.However, it is not specifically designed for C++. È possibile garantire maggiore portabilità del codice tramite la gestione delle eccezioni C++.You can ensure that your code is more portable by using C++ exception handling. Inoltre, il meccanismo di gestione delle eccezioni di C++ è molto più flessibile, in quanto è in grado di gestire eccezioni di qualsiasi tipo.Also, the C++ exception handling mechanism is much more flexible, in that it can handle exceptions of any type.

Nota

Per i programmi C++, è necessario utilizzare la gestione delle eccezioni C++ anziché la gestione delle eccezioni strutturata.For C++ programs, C++ exception handling should be used instead of structured exception handling. Per altre informazioni, vedere Gestione delle eccezioni in Riferimenti al linguaggio C++.For more information, see Exception Handling in the C++ Language Reference.

Vedere l'esempio relativo all'istruzione try-except per vedere come funziona l'istruzione try-finally.See the example for the try-except statement to see how the try-finally statement works.

Fine sezione specifica MicrosoftEND Microsoft Specific

Vedere ancheSee Also

Istruzione try-finallytry-finally Statement