2010-09-27 17 views

risposta

8

questa non è una domanda C#/java/C++. Come funziona internamente, come la linea sa di prendere una dichiarazione.

Come funziona internamente questo rende piuttosto una domanda C#/java/C++ (perché verrà implementata in modo diverso).

In Java, un blocco try si installa in una tabella speciale (nel file di classe). Quando la JVM lancia un'eccezione, guarda quella tabella per vedere dove si trova il prossimo fermo o blocco finale.

6

Quando si verifica un'eccezione viene eseguita un'istruzione speciale (generalmente chiamata interrupt). Ciò porta all'esecuzione di un gestore di errori generico che deduce quale è l'ultimo gestore di eccezioni adatto installato. Questo gestore viene quindi eseguito.

+0

che è tutto sanno ... il gestore figlio esegue prima .. mi aspetto risposta dal software di sistema/assembly /.net framework – selvaraj

+0

potresti spiegare che l'istruzione speciale che qualunque cosa tu pensi – selvaraj

+2

@saj: Nei programmi C++ nativi viene usata un'istruzione di processore speciale 'int' che viene eseguita e interrompe il programma e quindi il controllo viene automaticamente trasferito al gestore di interrupt del sistema operativo che a sua volta vede che si tratta di un'eccezione C++ e trasferisce il controllo al gestore di eccezioni C++. – sharptooth

0

dovrebbe funzionare in tutte le langues un po 'come questo:

if (error_occured xy while doing things in try){ 
    call_catch_part(error xy) 
} 
0

Si tratta essenzialmente di parsing fondamenti del linguaggio. È possibile ottenere tutte le informazioni al Here

0

si potrebbe fare lo stesso in C anche se non esiste alcuna gestione delle eccezioni di per sé.

Ci si dovrebbe usare setjmp/longjmp sfortunatamente quindi non si ottiene lo stack che si srotola e si deve gestire tutto il tempo necessario.

5

Esiste una differenza sul modo in cui le eccezioni vengono gestite tecnicamente tra linguaggi compilati in modo nativo come C++ e lingue utilizzando codice in byte eseguito su una macchina virtuale come Java o C#.

I compilatori C++ di solito generano codice che protocolli le informazioni necessarie per la gestione delle eccezioni in fase di esecuzione. Una struttura dati dedicata viene utilizzata per ricordare l'ingresso/l'uscita dei blocchi try e il gestore delle eccezioni associato. Quando si verifica un'eccezione, viene generato un interrupt e il controllo viene passato al sistema operativo che a sua volta controlla lo stack di chiamate e determina il gestore di eccezioni da chiamare.

Ulteriori dettagli sono abbastanza ben spiegati nel seguente articolo di Vishal Kochhar:

How a C++ compiler implements exception handling

in Java o .NET non è necessario per il sovraccarico di mantenere la gestione delle eccezioni informazioni poiché il runtime sarà in grado di analizzare il codice byte per trovare il gestore delle eccezioni pertinente. Di conseguenza, solo le eccezioni effettivamente generate generano un sovraccarico.

Problemi correlati