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:
La sezione protetta viene eseguita.
Se non si verifica alcuna eccezione durante l'esecuzione della sezione protetta, l'esecuzione continuerà nell'istruzione dopo la clausola
__except
.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 conteneretry-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