Condividi tramite


Istruzione try-except (C)

Microsoft-specific

L'istruzione try-except è un'estensione Microsoft al 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 essere completamente ripristinate da eccezioni hardware o software, la gestione delle eccezioni strutturate consente di registrare e visualizzare le informazioni sugli errori. È utile trappolare 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 clausola è la __trysezione protetta. L'istruzione composta dopo la __except clausola è il gestore delle eccezioni. Il gestore specifica un set di azioni da eseguire se viene generata un'eccezione durante l'esecuzione della sezione protetta. 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, 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 lo stack per un gestore, prima per contenere try-except istruzioni, quindi per i gestori con la precedenza 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 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 in modo specifico per C++. Per i programmi C++ portatili, la gestione delle eccezioni C++ deve essere usata anziché la gestione delle eccezioni strutturate. 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 nella guida di riferimento al 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 tutte le variabili locali dichiarate.

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 di un'istruzione try-except usando la longjmp funzione run-time viene considerata terminazione anomala. Non è legale passare a un'istruzione __try , ma è legale saltare da uno. Il gestore eccezioni non viene chiamato se un processo viene ucciso al centro dell'esecuzione di un'istruzione try-except .

Esempio

Ecco un esempio di gestore eccezioni e un gestore di terminazione. Per altre informazioni sui gestori di terminazione, vedere try-finally 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 commenti aggiunti 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-specific Microsoft

Vedi anche

try-except istruzione (C++)