Condividi tramite


try-except l'istruzione

Specifici di Microsoft

La sintassi seguente viene illustrata la un try-except l'istruzione:

__try 
{
   // guarded code
}
__except ( expression )
{
   // exception handler code
}

Note

try-except l'istruzione è un'estensione Microsoft ai linguaggi e C++ che consente alle applicazioni di destinazione per il controllo quando gli eventi che generalmente prevede l'esecuzione del programma si verificano.Tali eventi vengono chiamati eccezioni e il meccanismo che gli unit con le eccezioni viene chiamato gestione delle eccezioni strutturata.

per informazioni correlate, vedere try-finally istruzione.

Le eccezioni possono essere basate sull'hardware o basate su software.Anche quando le applicazioni non è completamente recuperare le eccezioni hardware o software, la gestione delle eccezioni strutturata consente di visualizzare informazioni sugli errori e applicare l'abbondanza allo stato interno dell'applicazione consentono di diagnosticare il problema.Questo risulta particolarmente utile per i problemi saltuari che non possono essere riprodotti facilmente.

[!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 è il corpo o la sezione accessibile.L'istruzione composto dopo __except la clausola è il gestore di eccezioni.Il gestore specifica un set di azioni da intraprendere se viene generata un'eccezione durante l'esecuzione del corpo della sezione accessibile.l'esecuzione continua come segue:

  1. La sezione accessibile viene eseguita.

  2. Se alcuna eccezione si verifica durante l'esecuzione della sezione accessibile, l'esecuzione continuerà all'istruzione successiva a __except clausola.

  3. Se si verifica un'eccezione durante l'esecuzione della sezione accessibile o in qualsiasi routine la sezione accessibile chiama, __except espressione (denominato filtro l'espressione viene valutata e il valore determina come l'eccezione non è gestita.Esistono tre valori:

    EXCEPTION_CONTINUE_EXECUTION (- 1)   L'eccezione viene chiusa.Continuare l'esecuzione nel punto in cui si è verificata l'eccezione.

    EXCEPTION_CONTINUE_SEARCH (0)   L'eccezione non è stata riconosciuta.Continuare la ricerca nello stack un gestore, anzitutto contenere try-except istruzioni, quindi per i gestori con la precedenza più elevata successivo.

    EXCEPTION_EXECUTE_HANDLER (1)   L'eccezione viene riconosciuta.Controllo di trasferimento al gestore di eccezioni esecuzione __except l'istruzione composto, quindi continua l'esecuzione dopo __except blocco.

Poiché il salvo l'espressione viene valutata come espressione di tipo c, è limitata a un singolo valore, l'operatore di espressione condizionale, o dell'operatore virgola.Se l'elaborazione più estesa è necessaria, l'espressione può chiamare una routine che restituisce uno dei tre valori sopra elencati.

Ciascuna applicazione può disporre di un gestore di eccezioni.

Non è valida passare a __try istruzione, ma valido uscire da uno.Il gestore eccezioni non viene chiamato se un processo viene terminato al centro di eseguire un oggetto try-except istruzione.

Per ulteriori informazioni, vedere l'articolo della Knowledge Base Q315937: HOW TO: Intercettare un overflow dello stack in un'applicazione Visual C++.

La parola chiave __leave

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

In goto l'istruzione inoltre possibile ignorare la sezione accessibile e non comporta una riduzione delle prestazioni e in un oggetto try-finally istruzione poiché la rimozione dello stack non si verifica.Tuttavia, è consigliabile utilizzare __leave parola chiave anziché a goto istruzione perché è meno probabile fare un errore di programmazione se la sezione accessibile è grande o complessa.

s58ftw19.collapse_all(it-it,VS.110).gifFunzioni intrinseche di gestione delle eccezioni strutturata

La gestione delle eccezioni strutturata vengono fornite due funzioni intrinseche disponibili per l'utilizzo con try-except istruzione: GetExceptionCode e GetExceptionInformation.

GetExceptionCode restituisce il codice (un intero a 32 bit) dell'eccezione.

la funzione intrinseca GetExceptionInformation restituisce un puntatore a una struttura contenente informazioni aggiuntive sull'eccezione.Tramite questo puntatore, è possibile accedere allo stato di computer che era al momento di un'eccezione hardware.La struttura è la seguente:

struct _EXCEPTION_POINTERS {
      EXCEPTION_RECORD *ExceptionRecord,
      CONTEXT *ContextRecord }

_Di i tipi puntatoreEXCEPTION_RECORD e _CONTESTO essere definito nel file di inclusione EXCPT.H.

È possibile utilizzare GetExceptionCode all'interno del gestore di eccezioni.Tuttavia, è possibile utilizzare GetExceptionInformation solo all'interno dell'espressione di filtro eccezioni.Le informazioni che indica in genere nello stack e non sono più disponibili quando il controllo viene trasferito al gestore di eccezioni.

la funzione intrinseca AbnormalTermination è disponibile all'interno di un gestore di terminazione.Restituisce 0 se il corpo di try-finally l'istruzione termina in sequenza.in tutti gli altri casi, restituisce 1.

EXCPT.H definisce alcuni nomi alternativi per queste funzioni intrinseche:

GetExceptionCode equivale a _exception_code

GetExceptionInformation equivale al _exception_information

AbnormalTermination equivale al _abnormal_termination

Esempio

// exceptions_try_except_Statement.cpp

// Example of try-except and try-finally statements

#include <stdio.h>

#include <windows.h> // for EXCEPTION_ACCESS_VIOLATION

#include <excpt.h>

int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {

   puts("in filter.");

   if (code == EXCEPTION_ACCESS_VIOLATION) {

      puts("caught AV as expected.");

      return EXCEPTION_EXECUTE_HANDLER;

   }

   else {

      puts("didn't catch AV, unexpected.");

      return EXCEPTION_CONTINUE_SEARCH;

   };

}

int main()

{

   int* p = 0x00000000;   // pointer to NULL

   puts("hello");

   __try{

      puts("in try");

      __try{

         puts("in try");

         *p = 13;    // causes an access violation exception;

      }__finally{

puts("in finally. termination: ");

puts(AbnormalTermination() ? " \tabnormal" : "\tnormal");

      }

   }__except(filter(GetExceptionCode(), GetExceptionInformation())){

      puts("in except");

   }

   puts("world");

}

Output

hello
in try
in try
in filter.
caught AV as expected.
in finally. termination:
        abnormal
in except
world

Microsoft FINALE specifico

Vedere anche

Riferimenti

Scrittura di un gestore eccezioni

Gestione delle eccezioni strutturata (C++)

Parole chiave C++