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.
- 1. Come vengono implementati i tipi di membri?
- 2. Come vengono implementati i riferimenti deboli?
- 3. Come vengono implementati i parser DOM?
- 4. Come vengono implementati i C# Generics?
- 5. Come vengono implementati i canali Go?
- 6. Come vengono implementati malloc e gratuiti?
- 7. Come vengono implementati gli array in Perl?
- 8. Come vengono implementati i vtables in C++ e C#?
- 9. Come vengono implementati i comandi incorporati nella shell?
- 10. Come vengono implementati i riferimenti nella JVM di Oracle?
- 11. Come vengono implementati i turni a livello hardware?
- 12. Come vengono implementati i test di chat di Facebook?
- 13. Come vengono implementati i valori opzionali in Swift?
- 14. Come vengono implementati sbrk/brk in Linux?
- 15. I blocchi Objective-C vengono rilasciati automaticamente?
- 16. Pygame ritarda quando vengono implementati due giocatori
- 17. Come vengono implementati gli elenchi collegati senza l'uso del puntatore?
- 18. Come vengono implementati generatori e coroutine in CPython?
- 19. Come vengono implementati CSS e DOM nel browser?
- 20. Come vengono implementati gli automatismi finiti nel codice?
- 21. Come vengono implementati gli elenchi di argomenti di lunghezza variabile?
- 22. Come vengono implementati gli argomenti variabili in gcc?
- 23. Blocchi statici - quando vengono eseguiti
- 24. tryCatch e ggplot
- 25. Perché i blocchi vengono eseguiti su oggetti separati?
- 26. Come trovo i protocolli implementati nell'oggetto Clojure?
- 27. Come vengono implementati i punti di interruzione del debugger in modo efficiente?
- 28. Come vengono implementati i trigger di database all'interno di un motore di database SQL?
- 29. Come vengono implementati i puntatori di percpu nel kernel di Linux?
- 30. Cosa determina il processo in base al quale vengono risolti i metodi non implementati?
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