2010-03-13 18 views
5

cosa si comporta il programma quando hanno due eccezioni. E nessuno di loro è stato ancora catturato. quale tipo di gestore verrà chiamato. diciamo che entrambe le eccezioni erano di tipo diverso. Mi scuso se non sono chiaro ma sento di essermi reso abbastanza chiaro. grazie !!!cosa succede quando si verificano due eccezioni?

cosa succede se il blocco try genera un'eccezione e provare blocco si esce che destroyes tutti i variables.Lets automatiche dicono uno era un oggetto automatico e suo distruttore di nuovo gettato un exception.Now abbiamo due non rilevata domanda exception.My si basa su questo fatto. grazie !!

+1

Si prega di spiegare esattamente cosa sta accadendo con il sistema operativo e il compilatore. – compie

+3

+1 per restare a galla. Questa potrebbe non essere una domanda insolita da quei primi che si avvicinano alla gestione delle eccezioni. Buone possibilità di chiarire la confusione di questo thread. –

+0

Puoi spiegare di più sulla tua domanda? Se l'eccezione proviene dal sistema operativo, perché ti interessa perché il sistema operativo lo gestirà. E se è da un compilatore, dipende dal compilatore (ma per lo più può essere lanciata solo un'eccezione) –

risposta

6

Dipende interamente dalla lingua. Tuttavia, in tutte le lingue che conosco non è possibile mai essere più eccezioni allo stesso tempo (nella stessa discussione). Se è stata lanciata un'eccezione, passa allo stack delle chiamate finché non viene catturata, senza che il codice venga eseguito durante questo periodo. Se l'eccezione non viene rilevata, il programma si blocca prima che possa essere generato un altro. Se viene catturato, l'eccezione non è più "attiva" e se il gestore lancia una nuova eccezione, quella precedente viene dimenticata.

+0

e se il blocco try genera un'eccezione e si prova il blocco viene eliminato che distrugge tutte le variabili automatiche. Diciamo che uno era un oggetto automatico e il suo distruttore ha di nuovo lanciato un'eccezione. Ora abbiamo due eccezioni non catturate. La mia domanda si basa su questo fatto. grazie !! –

+1

Ancora, dipende dalla lingua. In C++, il comportamento standard è quello di arrestare il programma in modo anomalo se un distruttore genera un'eccezione durante lo srotolamento dello stack (vedere http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.3). –

+0

In Java le eccezioni possono essere generate dal blocco catch o dal blocco finally. – johnstok

5

A livello CPU (su 86), v'è una situazione chiamato double fault:

sull'architettura x86, un'eccezione doppio errore si verifica se il processore incontra un problema durante il tentativo di servire un interrupt sospeso o eccezione.

Tuttavia, questo tipo di "doppio errore" è una situazione di livello molto basso e riguarda solo il kernel del sistema operativo.

+0

ci sono anche tre errori. –

0

Quando si verifica un'eccezione, il compilatore svolge lo stack (chiusura delle funzioni correnti e ritorno, funzione del chiamante). Se non viene rilevata alcuna eccezione principale del compilatore chiamato funzione di interruzione. Da questo programma termina in modo anomalo.

Ma durante lo unwinding stack se si verifica un'altra eccezione (per il tuo caso in destructor) rispetto a questo momento/punto senza raggiungere la funzione principale, il compilatore chiama la funzione abort che termina il programma in modo anomalo.

Se si sa che è possibile che si verifichi un'eccezione nel distruttore rispetto a quella che si deve gestire nel distruttore. Medie nel distruttore si dovrebbe avere un blocco di cattura per catturare quell'eccezione. In questo modo la seconda eccezione generata deve essere gestita all'interno di un distruttore e questa eccezione non è fuori dal distruttore e il programma deve essere salvato dall'arresto dovuto a due eccezioni generate contemporaneamente

Il compilatore gestisce solo un'eccezione alla volta. Se il compilatore trova più di un'eccezione, la chiamata interrompe la funzione in base alla quale il programma termina in modo anomalo.

0

Pochi linguaggi o framework possono fare un buon lavoro di gestione di un'eccezione che si verifica durante la pulizia da un'eccezione precedente. Una gestione efficace di tali situazioni richiederebbe il codice di pulizia per sapere quale eccezione, se presente, si è verificata sulla "linea principale". Concettualmente non sarebbe affatto difficile fornire tali informazioni al codice di pulizia, ma i framework generalmente non lo forniscono.

In caso contrario, il comportamento normale in C++ è quello di arrestare il sistema quando si verifica un'eccezione durante la pulizia da un'altra eccezione; I linguaggi Java e .NET in genere abbandonano qualsiasi eccezione in sospeso se si verifica un'eccezione di pulitura. Le versioni più recenti di Java, tuttavia, includono una funzionalità che (se usata) gestirà queste cose molto meglio.In un blocco try-with-resources, un'eccezione che si verifica durante la pulizia delle risorse quando non sono presenti altre eccezioni verrà trattata normalmente; se, tuttavia, era in sospeso un'eccezione, l'eccezione in sospeso rimarrà in sospeso ma la nuova eccezione verrà aggiunta all'elenco di "eccezioni soppresse". Sarebbe bello se ci fosse un modo per specificare che un particolare blocco finally dovrebbe comportarsi allo stesso modo, ma non conosco alcuna funzione per questo.

Problemi correlati