Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 sono denominati eccezioni e il meccanismo che gestisce le eccezioni è denominato gestione strutturata delle eccezioni.
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:
__trycompound-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 come segue:
Viene eseguita la sezione sorvegliata.
Se non si verifica alcuna eccezione durante l'esecuzione della sezione sorvegliata, l'esecuzione continua con l'istruzione dopo la
__exceptclausola .Se si verifica un'eccezione durante l'esecuzione della sezione sorvegliata o in qualsiasi routine chiamata alla sezione sorvegliata, l'espressione
__exceptviene 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-exceptle 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_HANDLERL'eccezione viene riconosciuta. Trasferire il controllo al gestore eccezioni eseguendo l'istruzione__exceptcomposta, 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 elencati in precedenza.
Annotazioni
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 C++ è molto più flessibile, in quanto può gestire le eccezioni di qualsiasi tipo. Per altre informazioni, vedere Gestione delle eccezioni nelle informazioni di riferimento sul linguaggio C++.
Ogni routine in un'applicazione può avere un proprio gestore eccezioni. L'espressione __except viene eseguita nell'ambito del __try corpo. Ha accesso a qualsiasi variabile locale dichiarata.
La __leave parola chiave è valida all'interno di un blocco di try-except istruzioni. L'effetto di __leave è passare alla fine del try-except blocco. L'esecuzione riprende dopo la fine del gestore eccezioni. Anche se un'istruzione goto può essere usata per ottenere lo stesso risultato, 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