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 __try
sezione 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:
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, 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 conteneretry-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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per