usar try transaction ejemplos como catch begin error-handling implementation

error-handling - transaction - try catch sql



¿Cómo se implementan los bloques try/catch? (6)

Si se produce una excepción en un bloque try , ¿cómo se transfiere la ejecución al bloque catch ? Esta no es una pregunta de C # / Java / C ++, solo me pregunto cómo funciona internamente.


Esta no es una pregunta ac # / java / c ++. Cómo funciona internamente, cómo sabe la línea para ir a la declaración de captura.

Cómo funciona esto internamente hace que esto sea una pregunta ac # / java / C ++ (porque se implementará de manera diferente).

En Java, un bloque try se instala solo en una tabla especial (en el archivo de clase). Cuando la JVM lanza una excepción, mira esa tabla para ver dónde está la próxima captura o bloque final para ir.


Cuando se produce una excepción, se ejecuta una instrucción especial (generalmente llamada interrupción ). Esto lleva a la ejecución de un controlador de errores genérico que deduce cuál es el último controlador de excepciones adecuado instalado. Ese manejador es luego ejecutado.


Debería funcionar en todos los idiomas algo así:

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


Es básicamente un análisis de los fundamentos del lenguaje. Puedes obtener toda la información Here


Existe una diferencia en la forma en que las excepciones se manejan técnicamente entre los lenguajes compilados de forma nativa, como C ++ y los lenguajes que utilizan el código byte que se ejecuta en una máquina virtual como Java o C #.

Los compiladores de C ++ generalmente generan código que procesa la información necesaria para el manejo de excepciones en tiempo de ejecución. Se utiliza una estructura de datos dedicada para recordar la entrada / salida de los bloques de prueba y el controlador de excepciones asociado. Cuando se produce una excepción, se genera una interrupción y se pasa el control al sistema operativo, que a su vez inspecciona la pila de llamadas y determina a qué administrador de excepciones llamar.

Más detalles están bastante bien explicados en el siguiente artículo de Vishal Kochhar:

Cómo un compilador de C ++ implementa el manejo de excepciones

En Java o .NET no hay necesidad de mantener la información sobre el manejo de excepciones, ya que el tiempo de ejecución podrá realizar una introspección del código de bytes para encontrar el controlador de excepciones correspondiente. Como consecuencia, solo las excepciones que se lanzan realmente causan una sobrecarga.


podría hacer lo mismo en C, aunque no haya ninguna excepción de manejo per se.

Allí setjmp / longjmp desafortunadamente, entonces no desenrollas la pila y tendrás que manejar todo el meollo de la carne.