Combinazione di eccezioni C (strutturate) e C++

Se si vuole scrivere codice portabile, non è consigliabile usare la gestione strutturata delle eccezioni (edizione Standard H) in un programma C++. Tuttavia, a volte può essere necessario compilare usando /EHa e combinare eccezioni strutturate e codice sorgente C++ e richiedere alcune funzionalità per la gestione di entrambi i tipi di eccezioni. Poiché un gestore di eccezioni strutturate non ha alcun concetto di oggetti o eccezioni tiptate, non può gestire le eccezioni generate dal codice C++. Tuttavia, i gestori C++ catch possono gestire eccezioni strutturate. La sintassi di gestione delle eccezioni C++ (try, throw, catch) non viene accettata dal compilatore C, ma la sintassi di gestione delle eccezioni strutturata (__try, __except, __finally) è supportata dal compilatore C++.

Vedere _set_se_translator per informazioni su come gestire le eccezioni strutturate come eccezioni C++.

Se si combinano eccezioni strutturate e C++, tenere presente questi potenziali problemi:

  • Le eccezioni C++ e le eccezioni strutturate non possono essere miste all'interno della stessa funzione.

  • I gestori di terminazione (__finally blocchi) vengono sempre eseguiti, anche durante la rimozione dopo la generazione di un'eccezione.

  • La gestione delle eccezioni C++ può intercettare e mantenere la semantica di rimozione in tutti i moduli compilati con le opzioni del /EH compilatore, che consentono la semantica di rimozione.

  • Potrebbero verificarsi alcune situazioni in cui le funzioni distruttori non vengono chiamate per tutti gli oggetti. Ad esempio, è possibile che si verifichi un'eccezione strutturata durante il tentativo di effettuare una chiamata di funzione tramite un puntatore di funzione non inizializzato. Se i parametri della funzione sono oggetti costruiti prima della chiamata, i distruttori di tali oggetti non vengono chiamati durante la rimozione dello stack.

Passaggi successivi

Vedi anche

Procedure consigliate C++ moderne per le eccezioni e la gestione degli errori