Condividi tramite


Istruzione try-except (C)

Specifico di Microsoft

L'istruzione try-except è un'estensione Microsoft del linguaggio C che consente alle applicazioni di ottenere il controllo di un programma quando si verificano eventi che normalmente terminano l'esecuzione. Tali eventi vengono chiamati eccezioni e il meccanismo che tratta le eccezioni viene chiamato gestione delle eccezioni strutturate.

Le eccezioni possono essere hardware o basate su software. Anche quando le applicazioni non possono eseguire completamente il ripristino da eccezioni hardware o software, la gestione strutturata delle eccezioni consente di registrare e visualizzare informazioni sugli errori. È utile intercettare lo stato interno dell'applicazione per diagnosticare il problema. In particolare, è utile per problemi intermittenti che non sono facili da riprodurre.

Sintassi

try-except-statement:
__try compound-statement __except ( expression ) compound-statement

L'istruzione composta dopo la __try clausola è la sezione sorvegliata. L'istruzione composta dopo la __except clausola è il gestore eccezioni. Il gestore specifica un set di azioni da eseguire se viene generata un'eccezione durante l'esecuzione della sezione sorvegliata. L'esecuzione procede nel modo seguente:

  1. La sezione protetta viene eseguita.

  2. Se non si verifica alcuna eccezione durante l'esecuzione della sezione protetta, l'esecuzione continuerà nell'istruzione dopo la clausola __except.

  3. Se si verifica un'eccezione durante l'esecuzione della sezione sorvegliata o in qualsiasi routine chiamata alla sezione sorvegliata, l'espressione __except viene valutata. Il valore restituito determina la modalità di gestione dell'eccezione. I tre valori possibili sono:

    • EXCEPTION_CONTINUE_SEARCH: l'eccezione non viene riconosciuta. Continuare a cercare nello stack un gestore, prima di tutto per contenere try-except le istruzioni, quindi per i gestori con la precedenza più alta successiva.

    • EXCEPTION_CONTINUE_EXECUTION: l'eccezione viene riconosciuta ma ignorata. Continuare l'esecuzione nel punto in cui si è verificata l'eccezione.

    • EXCEPTION_EXECUTE_HANDLER L'eccezione viene riconosciuta. Trasferire il controllo al gestore eccezioni eseguendo l'istruzione composta __except, quindi continuare l'esecuzione nel punto in cui si è verificata l'eccezione.

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

Nota

La gestione strutturata delle eccezioni funziona con i file di origine C e C++. Tuttavia, non è progettato specificamente per C++. Per i programmi C++ portatili, è consigliabile usare la gestione delle eccezioni C++ anziché la gestione strutturata delle eccezioni. Inoltre, il meccanismo di gestione delle eccezioni di C++ è molto più flessibile, in quanto è in grado di gestire eccezioni di qualsiasi tipo. Per altre informazioni, vedere Gestione delle eccezioni nelle informazioni di riferimento sul linguaggio C++.

Ogni routine in un'applicazione può essere associata al proprio gestore eccezioni. L'espressione __except viene eseguita nell'ambito del corpo __try. Ha accesso a qualsiasi variabile locale dichiarata.

La parola chiave __leave è valida all'interno di un blocco di istruzioni try-except. L'effetto di __leave è il passaggio alla fine del blocco try-except. L'esecuzione riprende dopo la fine del gestore eccezioni. Sebbene per ottenere lo stesso risultato possa essere utilizzata un'istruzione goto, un'istruzione goto causa la rimozione dello stack. L'istruzione __leave è più efficiente perché non comporta la rimozione dello stack.

L'uscita da un'istruzione try-except che usa la longjmp funzione di runtime è considerata terminazione anomala. Non è legale passare a una __try dichiarazione, ma è legale saltare fuori da uno. Il gestore eccezioni non viene chiamato se un processo viene terminato al centro dell'esecuzione di un'istruzione try-except .

Esempio

Di seguito è riportato un esempio di gestore di eccezioni e di un gestore di terminazione. Per altre informazioni sui gestori di terminazione, vedere try-finally l'istruzione (C).

.
.
.
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");

Ecco l'output dell'esempio, con il commento aggiunto a destra:

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                  */

END Specifico di Microsoft

Vedi anche

try-except istruzione (C++)