Professional Documents
Culture Documents
Por esto, y con fines pedaggicos, en este libro se emplea una interfaz de POSIX estilizada. Para cada llamada POSIX al sistema, se supone definida una macro que efectuara la comprobacin del error. Por ejemplo, una llamada al sistema como sys_call que tome un parmetro, tendr definida la siguiente macro,
tdefine SYS_CALL(A) if(syscall(A) != 0} error()
donde error es una funcin que efecta el procesamiento del error. As, en la llamada solo aparecer SYSCALL (param).
De nuevo, el principal reproche que puede hacerse a esta aproximacin es que los programas pueden volverse muy difciles de entender y de mantener.
Detectada por el entorno y generada sincrnicamente, como por ejemplo una violacin de los lmites de un array o una divisin por cero. Detectada por la aplicacin y generada sncronamente, como el fallo en la comprobacin de un aserto definido en el programa. Detectada por el entorno y generada asincrnicamente, como en las excepciones generadas como resultado de un fallo de alimentacin o en algn mecanismo de monitorizacin vital. Detectada por la aplicacin y generada asincrnicamente, como cuando un proceso verifica una condicin de error que ocasionara que un proceso no cumpla los plazos o no termine correctamente,
Las excepciones asncronas suelen recibir el nombre de notificaciones asncronas o seales, y se suelen emplear en el contexto de la programacin concurrentes Existen diversas formas de declarar las excepciones sncronas. Por ejemplo: Mediante un nombre constante que necesita ser declarado explcitamente. Mediante un objeto de cierto tipo que podr o no ser declarado explcitamente.
Ada precisa que las excepciones se declaren como constantes; por ejemplo, las excepciones que puede generar el entorno de ejecucin de Ada se declaran en el paquete Standard:
Este paquete es visible para todos los programas Ada. Java y C++ dan una visin de las excepciones mas orientada al objeto. En Java, las excepciones son instancias de una subclase de la clase Throwable, que podrn ser lanzadas (thrown) por el sistema de ejecucin y por la aplicacin. En C++, se pueden lanzar excepciones de cualquier tipo de objetos sin declararlas previamente.
Donde los bloques son la base de otras unidades, como pueden ser procedimientos o funciones, el dominio de un manejador de excepciones suele ser esa unidad. En algunos lenguajes, como Java, C++ o Modula-3, no todos los bloques pueden tener manejadores de excepciones, por lo que habr que declarar explcitamente el dominio de cada manejador de excepciones, a partir de lo cual se considerara que el bloque esta vigilado (guarded); en Java, esto se indica usando un bloque try:
try { .
// sentencias que pueden generar una excepcin catch (ExceptionType e) { // manejador para e
Puesto que el dominio de un manejador de excepciones especifica donde puede haberse generado el error, podra ocurrir que el bloque 5
presentara adecuada.
una
granularidad
El problema para el manejador es decidir que calculo provoco que se generara la excepcin, Aun hay mas problemas si consideramos desbordamientos o subdesbordamientos aritmticos. Una solucin del problema, con dominios de manejo de excepciones basados en bloques, sera disminuir el tamao del bloque y/o anidarlo. Otra alternativa es crear procedimientos con manejadores para cada uno de los bloques anidados. Sin embargo, y de cualquier modo, es una solucin demasiado prolija y tediosa. Otra solucin es permitir el manejo de excepciones a nivel de sentencia. La mejor aproximacin a este problema es permitir el paso de parmetros junto a las excepciones. Java lo hace automticamente, dado que una excepcin es un objeto, y en consecuencia puede contener tanta informacin como desee el programador. Por contra, Ada proporciona un procedimiento predefinido Exception_Informatin que devuelve detalles definidos en la implementacin sobre la aparicin de la excepcin.
de su alcance, haciendo imposible su captura por un manejador. Para hacer frente a esta situacin, la mayora de los lenguajes proporcionan un manejador atrapa todo (catch all). Una excepcin sin manejar provoca que un programa secuencial sea abortado. Normalmente, si el programa consta de mas de un proceso y alguno de ellos no maneja cierta excepcin que hubiera generado, se abortara ese proceso. Sin embargo, no queda claro si se debiera propagar la excepcin al proceso padre. Otra cuestin sobre la propagacin de excepciones es si los manejadores se asocian a las excepciones dinmica o estticamente. La asociacin esttica se efecta en la compilacin, por lo que no permite la propagacin, al no conocerse la cadena de procedimientos invocadores. La asociacin dinmica se realiza en ejecucin, y consecuentemente permite la propagacin. Aunque la asociacin dinmica es ms flexible, conlleva mas sobrecarga en la ejecucin donde haya que buscar el manejador correspondiente; en la asociacin esttica es posible generar la direccin del manejador en la compilacin.
error, y el bloque podr comprobar dicho indicador. Observe que para que funcione este esquema, las variables locales del bloque no deben ser reinicializadas en el reintento. Cuando realmente se nota la ventaja del modelo de reanudacin es cuando la excepcin ha sido generada asincronamente, y por tanto tiene poco que ver con la ejecucin actual del proceso.
10
procedure Restaura;
Guarda; procedure
end Cache_Recuperacion;
Obviamente, hay algo de magia en este paquete que requerir la ayuda del sistema de ejecucin y, posiblemente, incluso el apoyo del hardware para la cache de recuperacin. Asimismo, puede que no sea esta la forma ms eficiente de efectuar la restauracin de un estado. Sera preferible proporcionar primitivas mas bsicas, y permitir que el programa emplee su conocimiento de la aplicacin para optimizar la cantidad de informacin salvaguardada. La finalidad del prximo ejemplo es mostrar que es posible usar bloques de recuperacin con las tcnicas dadas de la implementacin de la cache de recuperacin en un entorno de manejo de excepciones. El esquema de bloque de recuperacin puede adems implementarse usando un lenguaje con excepciones, contando adems con un poquito de ayuda por parte del sistema de soporte de eje11
cucin. Por ejemplo, en Ada la estructura para un bloque de recuperacin con triple redundancia podra ser:
procedure Bloque,_Recuperacin is Fallo_Primario, Fallo_Secundario, Fallo_Terciario : exception; Fallo_Bloque_Recuperacin : exception; type Modulo is (Primario, Secundario, Terciario); functin Test_Aceptacin return Boolean is begin --- cdigo del test de aceptacidon end Test_Aceptacion; procedure Primario is begin -- cdigo del algoritmo primario if not Test_Aceptacion then raise Fallo_Primario; end if; exception when Fallo_Primario => -- recuperacin haca delante para devolver -- el entorno al estado requerido raise; when others => -- error inesperado -- recuperacin haca delante para devolver -- el entorno al estado requerido raise Fallo_Primario; end Primario; procedure Secundario is begin -- cdigo del algoritmo secundario if not Test_Aceptacion then raise Fallo_Secundario; end if; exception when Fallo_Secundario => -- recuperacin haca delante para devolver -- el entorno al estado requerido raise; when others =>
12
-- error inesperado -- recuperacin haca delante para devolver -- el entorno al estado requerido raise Fallo_Secundario; end Secundario; procedure Terciario is begin -- cdigo del algoritmo secundario if not Test_Aceptacion then raise Fallo_Terciario; end if; exception when Fallo_Terciario => -- recuperacin haca delante para devolver -- el entorno al estado requerido raise; when others => -- error inesperado -- recuperacin haca delante para devolver -- el entorno al estado requerido raise Fallo_Terciario; end Terciario; begin Cache_Recuperacin.Guarda; for Intento in Modulo loop begin case Intento is when Primario => Primario; exit; when Secundario ~> Secundaria; exit; when Terciario => Terciario; end case; exception when FalloPrimario => Cache_Recuperacin.Restaura; when Fallo_Secun.dario => Cache_Recuperacin. Restaura ; when Fallo_Terciario => Cache_Recuperacin.Restaura; raise Fallo_Bloque_Recuperacion; when others => Cache_Recuperacin.Restaura; raise FalloBloque_Recuperacion;
13
14