2010-09-27 16 views

Respuesta

8

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

La forma en que esto funciona internamente hace que esta sea prácticamente una pregunta C#/java/C++ (porque se implementará de manera diferente).

En Java, un bloque try se instala en una tabla especial (en el archivo de clase). Cuando la JVM arroja una excepción, mira esa tabla para ver dónde está el próximo bloque catch o finally to read.

6

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

+0

que es todo lo que se sabe .. el controlador de niños se ejecuta primero .. estoy esperando la respuesta del software del sistema/assembly /.net framework – selvaraj

+0

podría explicar que la instrucción especial que sea lo que piense – selvaraj

+2

@saj: en programas C++ nativos se usa una instrucción de procesador especial 'int' que se ejecuta y detiene el programa y luego el control se transfiere automáticamente al controlador de interrupción del sistema operativo que a su vez, ve que es una excepción de C++ y transfiere el control al controlador de excepciones de C++. – sharptooth

0

que debería funcionar en todos los langues algo como esto:

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

Se trata básicamente de parseando fundamentos de la lengua. Puede obtener toda la información en Here

0

puede hacer lo mismo en C aunque no exista ninguna excepción.

Ahí usaría setjmp/longjmp desafortunadamente entonces no obtiene el desenrollado de la pila y tiene que manejar todo lo esencial.

5

Existe una diferencia sobre cómo se manejan técnicamente las excepciones entre lenguajes nativamente compilados como C++ y los lenguajes que usan byte-código que se ejecuta en una máquina virtual como Java o C#.

Los compiladores de C++ generalmente generan código que protocoliza 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 try y el manejador de excepciones asociado. Cuando se produce una excepción, se genera una interrupción y el control pasa al sistema operativo, que a su vez inspecciona la pila de llamadas y determina a qué controlador de excepciones debe llamar.

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

How a C++ compiler implements exception handling

En Java o .NET no hay necesidad de que la sobrecarga de mantener información de gestión de excepciones ya que el tiempo de ejecución podrá introspectar el código de bytes para encontrar el manejador de excepciones relevante. Como consecuencia, solo las excepciones que realmente se lanzan están causando una sobrecarga.

Cuestiones relacionadas