Istruzione try-except (C)try-except Statement (C)

Sezione specifica MicrosoftMicrosoft Specific

L'istruzione try-except è un'estensione Microsoft per il linguaggio C che consente alle applicazioni di ottenere il controllo di un programma quando si verificano eventi che generalmente terminano l'esecuzione.The try-except statement is a Microsoft extension to the C language that enables applications to gain control of a program when events that normally terminate execution occur. Tali eventi vengono chiamati eccezioni e il meccanismo che tratta le eccezioni viene chiamato gestione delle eccezioni strutturate.Such events are called exceptions, and the mechanism that deals with exceptions is called structured exception handling.

Le eccezioni possono essere basate sull'hardware o sul software.Exceptions can be either hardware- or software-based. Anche quando le applicazioni non possono completamente recuperare le eccezioni hardware o software, la gestione delle eccezioni strutturata consente di visualizzare informazioni sugli errori e intercettare lo stato interno dell'applicazione per diagnosticare il problema.Even when applications cannot completely recover from hardware or software exceptions, structured exception handling makes it possible to display error information and trap the internal state of the application to help diagnose the problem. Ciò è particolarmente utile per i problemi saltuari che non possono essere riprodotti facilmente.This is especially useful for intermittent problems that cannot be reproduced easily.

SintassiSyntax

try-except-statement:try-except-statement:
__try compound-statement__try compound-statement

__except ( espressione ) compound-statement__except ( expression ) 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 __except è il gestore dell'eccezione.The compound statement after the __except clause is the exception handler. Il gestore specifica un set di azioni da intraprendere se viene generata un'eccezione durante l'esecuzione della sezione protetta.The handler specifies a set of actions to be taken if an exception is raised during execution of the guarded section. L'esecuzione procede nel modo seguente:Execution proceeds as follows:

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

  2. Se non si verifica alcuna eccezione durante l'esecuzione della sezione protetta, l'esecuzione continuerà nell'istruzione dopo la clausola __except.If no exception occurs during execution of the guarded section, execution continues at the statement after the __except clause.

  3. Se si verifica un'eccezione durante l'esecuzione della sezione protetta o nelle routine chiamate dalla sezione protetta, l'espressione __except viene valutata e il valore restituito determina come viene gestita l'eccezione.If an exception occurs during execution of the guarded section or in any routine the guarded section calls, the __except expression is evaluated and the value returned determines how the exception is handled. Sono disponibili tre valori:There are three values:

    EXCEPTION_CONTINUE_SEARCH L'eccezione non viene riconosciuta.EXCEPTION_CONTINUE_SEARCH Exception is not recognized. Continuare la ricerca dello stack per un gestore, prima per contenere le istruzioni try-except, quindi per i gestori con la precedenza successiva più elevata.Continue to search up the stack for a handler, first for containing try-except statements, then for handlers with the next highest precedence.

    EXCEPTION_CONTINUE_EXECUTION L'eccezione viene riconosciuta ma viene ignorata.EXCEPTION_CONTINUE_EXECUTION Exception is recognized but dismissed. Continuare l'esecuzione nel punto in cui si è verificata l'eccezione.Continue execution at the point where the exception occurred.

    EXCEPTION_EXECUTE_HANDLER L'eccezione viene riconosciuta.EXCEPTION_EXECUTE_HANDLER Exception is recognized. Trasferire il controllo al gestore eccezioni eseguendo l'istruzione composta __except, quindi continuare l'esecuzione nel punto in cui si è verificata l'eccezione.Transfer control to the exception handler by executing the __except compound statement, then continue execution at the point the exception occurred.

    Poiché l'espressione __except viene valutata come un'espressione C, è limitata a un singolo valore, l'operatore di espressione condizionale o l'operatore virgola.Because the __except expression is evaluated as a C expression, it is limited to a single value, the conditional-expression operator, or the comma operator. Se è necessaria un'elaborazione più estesa, l'espressione può chiamare una routine che restituisce uno dei tre valori sopra elencati.If more extensive processing is required, the expression can call a routine that returns one of the three values listed above.

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.

Ogni routine in un'applicazione può essere associata al proprio gestore eccezioni.Each routine in an application can have its own exception handler. L'espressione __except viene eseguita nell'ambito del corpo __try.The __except expression executes in the scope of the __try body. Ciò significa che ha accesso a tutte le variabili locali dichiarate lì.This means it has access to any local variables declared there.

La parola chiave __leave è valida all'interno di un blocco di istruzioni try-except.The __leave keyword is valid within a try-except statement block. L'effetto di __leave è il passaggio alla fine del blocco try-except.The effect of __leave is to jump to the end of the try-except block. L'esecuzione riprende dopo la fine del gestore eccezioni.Execution resumes after the end of the exception handler. 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-except usando la funzione di runtime longjmp viene considerata una terminazione anomala.Exiting a try-except statement using 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. Il gestore di eccezioni non viene chiamato se un processo viene terminato nel corso dell'esecuzione di un'istruzione try-except.The exception handler is not called if a process is killed in the middle of executing a try-except statement.

EsempioExample

Di seguito è riportato un esempio di un gestore eccezioni e di un gestore di terminazione.Following is an example of an exception handler and a termination handler. Per altre informazioni sui gestori di terminazione, vedere Istruzione try-finally.See The try-finally Statement for more information about termination handlers.

.  
.  
.  
puts("hello");  
__try{  
   puts("in try");  
   __try{  
      puts("in try");  
      RAISE_AN_EXCEPTION();  
   }__finally{  
      puts("in finally");  
   }  
}__except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ){  
   puts("in except");  
}  
puts("world");  

Si tratta dell'output nell'esempio, con il commento aggiunto a destra:This is the output from the example, with commentary added on the right:

hello  
in try              /* fall into try                     */  
in try              /* fall into nested try                */  
in filter           /* execute filter; returns 1 so accept  */  
in finally          /* unwind nested finally                */  
in except           /* transfer control to selected handler */  
world               /* flow out of handler                  */  

Fine sezione specifica MicrosoftEND Microsoft Specific

Vedere ancheSee Also

Istruzione try-excepttry-except Statement