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:
La sezione accessibile viene eseguita.
Se alcuna eccezione si verifica durante l'esecuzione della sezione accessibile, l'esecuzione continuerà all'istruzione successiva a __except clausola.
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.
Funzioni 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