Se si verifica un'eccezione in un blocco try
, come viene trasferita l'esecuzione al blocco catch
? Questa non è una domanda C#/Java/C++, mi chiedo solo come funziona internamente.Come vengono implementati i blocchi try/catch?
risposta
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.
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.
dovrebbe funzionare in tutte le langues un po 'come questo:
if (error_occured xy while doing things in try){
call_catch_part(error xy)
}
Si tratta essenzialmente di parsing fondamenti del linguaggio. È possibile ottenere tutte le informazioni al Here
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:
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.
che è tutto sanno ... il gestore figlio esegue prima .. mi aspetto risposta dal software di sistema/assembly /.net framework – selvaraj
potresti spiegare che l'istruzione speciale che qualunque cosa tu pensi – selvaraj
@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