Excepciones Informática III.

Slides:



Advertisements
Presentaciones similares
FUNDAMENTALS OF THE JAVA PROGRAMMING LANGUAGE (SL-110) CAPÍTULO 13 Ing. Ronald Criollo.
Advertisements

Java nos ofrece System.out para escribir en pantalla, pero también tenemos System.in para leer. System.in es un objeto de una clase de java que se llama.
Ayudantía Pre-Actividad 5 Multimedios. Ayudantía Pre-Actividad 5 (1) creación de varias clases, y composición (2) manejo de threads (3) manejo de excepciones.
Exceptions y Assertions Introducción a la terminología Bloques: try, catch Uso de finally Bloques: try, catch, finally Categorías de Exceptions Excepciones.
Curso de java básico (scjp)
Archivos de Texto. Introducción Los archivos son una secuencia de bits que se guarda en el disco duro. La ventaja de utilizar archivos es que los datos.
EXCEPCIONES UNIDAD 5.
Programación Interactiva Manejo de Excepciones
Manejo de errores y excepciones
Lenguaje de programación Java
Clases Extendidas La clase extendida hereda los campos y métodos de la clase de la cual extiende. La clase original se conoce como superclase y la clase.
Programación en Java Instructor:.
MANEJO DE EXCEPCIONES EN C++
Arquitectura CLARO-TECNOTREE CAPITULO 4: Excepciones
Capitulo 4 Excepciones.
Siguiente Excepciones Introducción. AnteriorSiguiente Definición Una excepción es un evento que ocurre durante la ejecución de un programa que desestabiliza.
Informática II Prof. Dr. Gustavo Patiño MJ
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
1.2 Sintaxis del lenguaje Java.
UNIVERSIDAD LATINA (UNILA)
EXCEPCIÓN DE ERRORES.
RMI (Remote Method Invocation)
Teoría de lenguajes y compiladores
Excepciones y archivos Info 033. Exception El término Exception es la palabra corta para la frase "evento excepcional." Definition: Una excepción es un.
Manejo de excepciones en Java
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Lic. Rosemary Torrico Bascopé
INSTITUTO TECNOLOGICO DE TEHUACAN Ingeniería en sistemas computacionales Curso de apoyo a la titulación EXCEPCIONES EN JAVA Diciembre de 2008.
Abstracción de los datos y Orientación a Objeto Clase 13.
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6. SCJP 6.0 SEMANA CINCO CONSOLE.
Tema 6: Clases Antonio J. Sierra.
1 TEMA 5. Seguridad en Java 1.Introducción a los Controladores de Seguridad 2.Decidir qué Métodos Sobreescribir del SecurityManager 3.Escribir un Controlador.
Semana 5 Subprogramas..
UNIDAD 2 CLASES Y OBJETOS. CLASE Elementos cabecera y cuerpo de la clase. Cabecera: aporta información fundamental sobre la clase en sí y constituye de.
Excepciones Informática III.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
Tema 11: Excepciones Antonio J. Sierra.
1.1 Concepto y terminología
Subrutinas y Control de Abstracción
DISEÑO DE SOFTWARE 1ª. Parte
Material de apoyo Unidad 4 Estructura de datos
Computación II Unidad X Manejo de Excepciones. Presentación de la Unidad Objetivos: –Saber manejar situaciones inesperadas dentro de un programa –Comprender.
USO DE EXCEPCIONES EN JAVA LSC. Natalia Rodríguez Castellón.
Alcance Dinámico La Asociación Actual para un Nombre dado es el encontrado recientemente durante la ejecución, y no a sido destruido aun por el retornado.
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6. SCJP 6.0 SEMANA CUATRO CONTROL DE FLUJOS, EXCEPCIONES Y ASERSIONES.
Módulo 8: Manejo de Errores y Excepciones
Tratamiento de errores
Programación Orientada a Objetos Unidad 4 Excepciones Universidad de Chile Departamento de Ciencias de la Computación.
Excepciones Unidad 5.
1 Manejo de Excepciones y otros Agustín J. González ELO-329.
Programación avanzada en Java Miguel Ángel Corella 26 de Septiembre de 2005.
Herencia. Introducción La idea básica es poder crear clases basadas en clases ya existentes. Cuando heredamos de una clase existente, estamos re-usando.
Programación orientada a objetos Capítulo 12 Manejo de errores.
CARACTERÍSTICAS Es un lenguaje de programación estructurado de propósito general. Está estrechamente asociado al sistema operativo UNIX, ya que el propio.
Excepciones Informática III. Ing. José L. Simón/Ing. Nora BletPág. 2 Objetivos Ver modelos de excepciones en lenguajes de programación Uso de excepciones.
Tratamiento de excepciones
Definición y cumplimiento de responsabilidades Giovanni Hernández P. Nivel 4.
¿Qué son? – tipos – manejo - ejemplos
Metodología de Programación Ayudantía 4 lelagos.ublog.cl 2009.
Curso: Fundamentos de Computación
:: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación.
Desarrollador Profesional de Juegos Programación III Unidad I Capturar Excepciones.
Clases “ Es una Abstracción de un elemento del mundo real ”
Desarrollador Profesional de Juegos Programación III Unidad I Excepciones Tipos.
:: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación.
Programación orientada a objetos La programación orientada a objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa objetos.
Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Práctica 3.
Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Práctica 4 Versión Diseño de tipos Igualdad, representación, código,
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
Transcripción de la presentación:

Excepciones Informática III

Objetivos Ver modelos de excepciones en lenguajes de programación Uso de excepciones para obtener tolerancia a fallos

Excepciones En la práctica, la mayor parte de un sistema, está dedicada a tratar con situaciones anormales, excepcionales o no deseadas; la parte más pequeña corresponde a la propia aplicación: más de 2/3 del código! está dedicada a la detección y manejo de errores (Cristian, 1982) Es muy probable que esta porción, contenga errores (bugs) ya que, además de su complejidad, rara vez se ejecuta y tampoco se ensaya, documenta ni entiende adecuadamente El ejemplo más citado en la literatura es el accidente del cohete Ariane 5 debido a una excepción de software no manejada.

Excepciones: Caso del Ariane 5

Excepciones Aunque el trabajo de Goodenough (1975) puso los cimientos de la terminología relacionada con las excepciones, aún hoy día, no existe un acuerdo en la definición del concepto de excepción, como así tampoco en cuanto a su utilización En realidad, la palabra excepción sugiere “algo que ocurre muy raramente”. Sin embargo, esto se condice sólo parcialmente, con el uso que comúnmente se hace de ellas en la práctica diaria de la programación

Excepciones Las excepciones constituyen una forma adicional de pasar información al invocante de un método Por tanto, resuelven el problema de los lenguajes de programación que permiten un único valor de retorno Pueden utilizarse para distintos propósitos. Goodenough (1975) señala 3: Señalar una avería Clasificar un resultado (Ej.: overflow en suma, EOF), información adicional del resultado para que el invocante pueda interpretarlo adecuadamente Control (Ej. “se han procesado n registros”), el invocante desea que se le notifique que se alcanzó alguna condición Por tanto, no necesariamente indican “eventos excepcionales”. Ej.: en Java InterruptedException se utiliza para sincronizar threads

Excepciones y su uso Cuidado con su uso! Debería volverse a las raíces y recordar que las excepciones son excepcionales, usarlas para eventos raros (que no ocurren frecuentemente), no para el control del flujo normal. Lamentablemente no está de acuerdo con el uso actual de las excepciones en lenguajes tales como Java. En el siguiente ejemplo el 1º método es 750 veces más lento que el 2º (bajo Windows XP y Java 1.4) si se llama con una referencia que no sea del tipo Integer

Ejemplo public static boolean testForInteger1(Object x) { try { Integer i = (Integer) x; return true;} catch (Exception e) { return false;}} public static boolean testForInteger2(Object x) {return x instanceof Integer;}

Manejo de Excepciones Un mecanismo de excepciones debe cumplir una serie de requisitos: R1 (simplicidad): Sencillo de comprender y utilizar R2 (discreción): No afecta la claridad del código ni su comprensión R1 y R2 son cruciales en el diseño de sistemas fiables! R3 (eficiencia): Introduce sobrecarga en la ejecución sólo cuando se maneja una excepción R4 (uniformidad): Provee tratamiento uniforme de las excepciones del entorno y el software de aplicación R5 (recuperación): Permite la programación de acciones de recuperación

Mecanismos de Manejo Retorno de un valor inusual (C) Bifurcación forzada (Assembler) goto no local Excepciones (C++, Java)

Retorno de Valor Inusual (C) if( fopen(“archiv.dat”, “r”) != 0 ){ /* código de manejo de error */ } else { /* código normal */ };  R1  R2  R3  R4  R5

Bifurcación Forzada (Assembler) jsr pc, IMPRIME_SIMB jmp ERROR_ES jmp DISPOSITIVO_NO_PREPARADO # Procesamiento normal  R1  R2  R3  R4  R5 En caso de retorno normal la subrutina que envía un símbolo a un dispositivo, incrementa la dirección de retorno (contador de programa) en dos instrucciones jmp

goto No Local (Salto incondicional global) on error goto err_sub//versión de alto nivel del anterior ... Procedure Sub_1  R1 ...  R2 Endproc  R3 Procedure Sub_2  R4 Endproc  R5 Procedure err_sub // tratamiento de errores Endproc

Manejo de excepciones moderno Mecanismo estructurado para el tratamiento de las excepciones Provisto por el entorno de ejecución (runtime) Soportado directamente por el lenguaje de programación Provee tratamiento uniforme de las excepciones del entorno y del programa Mínima sobrecarga Soporte de múltiples manejadores de excepciones

Manejo de excepciones moderno Lenguajes que tienen incorporado el manejo de excepciones: C++ Java Visual Basic Delphi /Pearl/Eiffel/Ada… Todos los lenguajes .NET

Excepciones y su representación Síncronas: respuesta inmediata a una operación inapropiada de un fragmento de código Asíncronas (notificación asíncrona o señal): generadas tiempo después de que ocurra la operación que da lugar a la aparición del error. Puede generarse desde el proceso que ejecutó la operación originalmente, o en otro (contexto de aplicaciones concurrentes)

Excepciones síncronas Hay dos modelos para declararlas: Una constante  hace falta una declaración explícita (Ada) Un objeto de un tipo particular. No siempre hace falta declararlo explícitamente. (Java)

Dominio de un Manejador de Excepciones Dentro de un programa puede haber varios manejadores para una misma excepción Cada manejador tiene asociado un dominio o ámbito La granularidad del dominio determinará qué tan precisamente puede localizarse la fuente de la excepción. No todos los lenguajes permiten alcanzar un nivel de granularidad adecuado.

Dominio de un Manejador de Excepciones Bloque Protegido {//bloque vigilado(guarded) // sentencias que pueden generar una excepción } Manejador para Excepcion Tipo e1{ Manejador para Excepcion Tipo en{

Ámbito de los manejadores en Java No todos los bloques pueden tener manejadores de excepciones El ámbito de un manejador se indica explícitamente mediante un bloque vigilado (guarded), se indica con un bloque try

Ámbito de los manejadores en Java try { // Block of statements // At least one of which may throw an exception if ( /* Some condition obtains */ ) throw new ExceptionName(); } catch (ExceptionName ParameterName) { // Block of statements to be executed // If the ExceptionName exception is thrown in try } ... // Possibly other catch clauses } catch (ExceptionName2 ParameterName) { // If the ExceptionName2 exception is thrown in try } finally { // Optional block of statements that is executed // Whether an exception is thrown or not

Ámbito de los manejadores en Java Si se asocia un parámetro a la excepción que indique el punto donde se ha generado, el manejador puede usar esta información En Java la excepción es un objeto por tanto puede incluir tanta información como desee el programador

Ámbito de los manejadores en Java Se asemeja a una declaración de función, el parámetro es el tipo de excepción que atrapa Dentro del bloque el nombre del objeto es como una variable local Un manejador con parámetro de tipo T puede atrapar una excepción de tipo E si: T y E son del mismo tipo T es superclase de E (esto hace muy potente el mecanismo de manejo de excepciones de Java)

Ámbito de los manejadores en Java try { } catch (FileNotFoundException e) { System.err.println("FileNotFoundException: "+ e.getMessage());//lanza excepción generada por //el usuario throw new SampleException(e);} catch (IOException e) {//otra distinta de //FileNotFoundException System.err.println("Caught IOException: " + e.getMessage());}

Sentencia throw Se usa para lanzar excepciones en Java (verificadas o no verificadas) Debe estar contenida: dentro del ámbito dinámico de un bloque try y el tipo de excepción lanzada debe coincidir con al menos una de las claúsulas catch del bloque o, dentro de un constructor o método que tenga incluída la claúsula throws correspondiente a la excepción lanzada

Crear nuevas excepciones en Java An exception for validating that an integer is less than or equal to a certain maximum value: /** * IntOutOfRangeException reports an exception when an * integer exceeds its bound. */ public class IntOutOfRangeException extends Exception { public IntOutOfRangeException (int Bound) { super("The input value exceeds the bound " + Bound); } This error message will be printed when this exception is thrown. Java, Java, Java, 3E by R. Morelli | R. Walde Copyright 2006. Chapter 10: Exceptions

Crear nuevas excepciones en Java Bound is set in the IntField constructor. Java, Java, Java, 3E by R. Morelli | R. Walde Copyright 2006. Chapter 10: Exceptions public class IntField extends JTextField { private int bound = Integer.MAX_VALUE; public IntField(int size, int max) { super(size); bound = max; } public int getInt() throws NumberFormatException, IntOutOfRangeException { int num = Integer.parseInt(getText()); if (num > bound) throw new IntOutOfRangeException(bound); return num; } // getInt() // The rest of the class is unchanged } // IntField New constructor lets us set the bound. Throw exception if bound exceeded.

Crear nuevas excepciones en Java The IntFieldTester class tries to input an integer within a certain range: public class IntFieldTester extends JPanel implements ActionListener { // Code deleted here public void actionPerformed(ActionEvent evt) { try { userInt = intField.getInt(); message = "You input " + userInt + " Thank you."; } catch (NumberFormatException e) { JOptionPane.showMessageDialog(this, "The input must be an integer. Please reenter."); } catch (IntOutOfRangeException e) { JOptionPane.showMessageDialog(this, e.getMessage()); } finally { repaint(); } } // actionPerformed() } // IntFieldTester Get user’s input. Handle exceptions. An error dialog window.

Crear nuevas excepciones en Java Message icon.

Propagación de excepciones Cuando no hay manejador en un bloque hay dos formas de proceder: Considerarlo un error de programación Debe notificarse en tiempo de compilación. Aunque una excepción generada en un procedimiento sólo pueda ser manejada apropiadamente en el contexto del invocante (excepción de interfaz) Java permite que los procedimientos especifiquen qué excepciones pueden generar, es decir, cuáles no manejarán localmente, aunque, no requiere un manejador en el contexto del invocador public static void main(String argv[]) throws IOException { BufferedReader input = new BufferedReader (new InputStreamReader(System.in)); String inputString = input.readLine(); // May throw IOException }

Propagación de excepciones Propagar la excepción (Java), es decir buscar manejadores en la cadena de invocaciones

Propagación de excepciones

Propagación de excepciones Si un bloque o procedimiento no tiene un manejador adecuado para una excepción generada, esta se propaga hacia el invocador Si ningún procedimiento en la cadena de llamadas tiene un manejador adecuado, la excepción es manejada por el runtime, abortando el programa Muchos lenguajes proveen un manejador de tipo catch all. Posible solución en caso que el lenguaje precisa declarar el alcance de las excepciones.

Catch all en Java try { // statements which might raise the exception // IntegerConstraintError or ActuatorDead } catch(Exception E) { // handler will catch all exceptions of // type exception and any derived type; // but from within the handler only the // methods of Exception are accessible

Bloque finally en Java Java soporta una cláusula finally como parte de un bloque try-catch El código asociado a esta cláusula tiene garantizado su ejecución sin importar lo que ocurra con el que está en el bloque try Se utiliza para tareas de “limpieza”. Es una herramienta clave para prevenir pérdidas de recursos

Bloque finally en Java

Modelos de Tratamiento de Excepciones Siempre debemos determinar que conducta tomará el programa ante la presencia de una excepción Si el manejador resuelve el problema y el invocador puede continuar su ejecución, puede aplicarse el modelo de reanudación (o de notificación) Si no se devuelve el control al invocador el modelo se denomina de terminación o escape En un modelo híbrido el manejador puede decidir qué hacer

Modelo de Reanudación P Hq Q Hr R 1.-P invoca Q 2.-Q invoca R 6.-Hr reanuda R 5.-Hq reanuda Hr P Hq Q Hr R 4.-Hr genera la excepción q 3.-R genera la excepción r

Modelo de reanudación Ventaja: Cuando la excepción se generar asíncronamente, se puede reparar el daño y continuar (tiene poco que ver con el proceso en ejecución actualmente) Inconvenientes: Es difícil reparar los errores detectados por el entorno de ejecución Ejemplo: desborde aritmético en medio de una secuencia compleja de expresiones. Puede haber registros con evaluaciones parciales y el manejador puede sobreescribirlos Es difícil de realizar: Puede ejecutarse nuevamente el bloque desde el principio. El manejador puede establecer un indicador local para señalar que se produjo un error (retry, pero las variables locales del bloque no deben reinicializarse en el reintento)

Modelo de Terminación P Q R Terminación excepción Manejador Para R P invoca Q P Terminación Q invoca R Q R excepción Manejador Para R

Modelo de terminación El control no retorna al punto donde apareció la excepción, sino que se finaliza el bloque o procedimiento que contiene el manejador y se pasa el control al bloque o procedimiento de llamada. Un procedimiento invocado puede terminar en condiciones: normal o de excepción Cuando el manejador está dentro de un bloque (Java) el control pasa a la primer sentencia que sigue al bloque que maneja la excepción

Excepciones en Java Son objetos de una clase (Throwable) No hace falta declararlas explícitamente El código de la aplicación o el entorno de ejecución pueden lanzar (throw) una excepción El manejador apropiado la atrapa (catch). Debe hacer referencia a la clase o a una superclase Utiliza el modelo de terminación para el manejo de excepciones

Las tres clases de excepciones en Java Throwable Error Exception LinkageError VirtualMachineError RuntimeException unchecked checked

Las tres clases de excepciones en Java Excepciones comprobadas (checked exceptions): condiciones excepcionales que pueden anticiparse y recuperarse de ellas. Ej.: incluir manejador para java.io.FileNotFoundException en código para manejar archivos Son todas aquellas que no son del tipo Error o RuntimeException o subclases de ellas Son manejadas en un bloque try o el método que las puede generar debe proveer una cláusula throws donde se las liste (Catch or specify requirement)

Las tres clases de excepciones en Java Error: condiciones excepcionales externas a la aplicación y usualmente ésta no puede anticiparlas ni recuperarse de ellas. Ej.: OutOfMemoryError Error y subclases No están sujetos a los requerimientos de try o especificarlas en cláusulas throws. Igualmente pueden utilizarse

Las tres clases de excepciones en Java RunTimeException: Condiciones excepcionales internas a la aplicación y que usualmente la misma no puede anticipar o recuperarse de las mismas Usualmente indican errores de programación (bugs), con lo cual tiene más sentido corregirlos que atraparlos. Ej.: NullPointerException en lugar de un nombre de archivo pasado a FileReader Son de tipo RunTimeException o subclases No están sujetos a los requerimientos de try o especificarlas en cláusulas throws. Igualmente pueden utilizarse Las excepciones de este tipo y las de tipo Error son excepciones no comprobadas (unchecked exceptions)

Declaración Cada función debe declarar una lista de las excepciones verificadas que puede lanzar usando throws A, B, C. A, B y C son subclases de Exception La función puede lanzar (throw) cualquiera de las listadas y cualquier excepción no verificada Si la función intenta lanzar una excepción que no esté en la lista, se produce un error de compilación

Atrapar o especificar

Atrapar o especificar public FileReader(String fileName) throws FileNotFoundException public String readLine() throws IOException Cualquier función que invoque readFile debe atrapar la IOException o declarar (throws) que puede lanzarla

Excepciones encadenadas Una aplicación responde a una excepción lanzando otra, es decir la primer excepción causa la otra

Excepciones encadenadas try { }catch (IOException e) { throw new SampleException("Other IOException", e); } El stack trace provee información de la historia de la ejecución del thread actual y lista los nombres de las clases y métodos que fueron llamados en el punto donde ocurrió una excepción. Herramienta útil para hacer un debug, también permite construir un archivo de log

Resultados normales vs. Anormales (excepciones), Siedersleben (2006) Cada método cuando es invocado puede retornar básicamente dos tipos de resultados: Resultados normales Resultados anormales (excepciones) La decisión normal vs. anormal es binaria, no hay términos medios; además es local para el componente. Ej.: Una operación find() puede hallar 0 o muchos objetos que concuerden con la búsqueda (normal), aunque el invocante pueda considerarlo como anormal. Esta misma operación puede considerarse que retorna un resultado anormal si “se cae” la conexión a la base de datos aunque, el invocante del método puede intentar reconectarse a la base de datos y llamar a la operación nuevamente Si se mezclan es casi seguro que resultará en una violación de las reglas de abstracción de datos puesto que, el invocante de un método se ve confrontado con resultados de los cuales no es responsable y a los cuales tendría que manejar violando los principios de ocultamiento de la información

Resultados normales El resultado normal está al mismo nivel de abstracción de la interface del método La interface del método define todos los resultados normales del mismo. Los resultados son independientes de la implementación En la mayoría de los casos existen solo 1 o 2 resultados normales. Si existe un número mayor, debería cambiarse la interface. Por cada método todos los resultados normales son completamente enumerados como parte de las especificaciones Se consideran errores de la aplicación a aquéllos resultados normales, pueden que sean no deseados, aunque esperados. Ej.: En una rutina de manejo de archivo EOF puede considerarse un error pero es normal y esperado

Resultados anormales (excepciones) Anormal se usa como opuesto a normal No están al mismo nivel de abstracción que la interface del método Revelan detalles de implementación y se utilizan para eventos muy poco probables que ocurran. Si ocurren frecuentemente es debido a un diseño defectuoso y debería rediseñarse el método Pueden usarse también para indicar que un método fue invocado en forma inapropiada (Ej.: cuando se viola una precondición) Cualquier condición que no pueda manejarse en tiempo de ejecución son siempre anormales. Ej.: OutOfMemoryError

Resultados anormales (excepciones) Son dependientes de la implementación. Por tanto no es posible especificarlos en la interface del método (independiente de la implementación); pertenecen a la vista interna del componente, en la interface son irrelevantes. Nadie sería capaz de enumerarlos completamente todos los resultados anormales imaginables. Interrumpen el flujo normal y demandan algún tratamiento especial. En algunos casos es posible continuar después de la ocurrencia pero, en otros, la única opción es detener el sistema

Ejemplo 1 Un componente CuentaBancaria tiene un método extraerDinero cuyos resultados normales son: ok, nohaysaldo y cuentabloqueada. Problemas relacionados con la conexión remota (indicado por una excepción RemoteException) o acceso a la base de datos (indicado por ejemplo con una excepción SQLException) son anormales; revelan detalles información de implementación ocultos. El problema reside más que en este hecho, en que el invocante no le conciernen estos problemas dependientes de la implementación del cual no es responsable

Ejemplo 2 Dentro de la misma aplicación el método conectarABasedatos en una capa de acceso. En este caso los resultados normales son ok y nok (si la base de datos no está accesible). Un problema de conexión remota (indicada por una excepción RemoteException) sería considerado anormal, puesto que no tiene nada que ver con la interface de este método

¿Cómo manejar errores de aplicación? Para los errores de aplicación que son resultados normales esperados (aunque tal vez no deseados) se utilizan valores de retorno especiales (Ej.:null). Es mucho más elegante que manejar excepciones, principalmente en el caso de errores que ocurren a menudo (se evita la sobrecarga debido al uso de excepciones) Si no es posible, utilizar excepciones comprobadas (Java). En este caso, ser cauteloso: evite tanto tener métodos que lancen demasiadas excepciones comprobadas, como crear muchas nuevas excepciones (muchos bloques try-catch hace el código más largo y difícil de leer) Ejemplos: un método find() retornaría null o una lista vacía sino hay objetos que concuerden con la búsqueda. Un método extraerDinero que normalmente retorna el saldo después de una extracción lanzaría una excepción si la cuenta está sobregirada (por razones de performance, es esperable que ocurra raramente)

¿Cómo manejar resultados anormales? Las excepciones son resultados anormales de una invocación a un método, son inesperados En lo posible usar excepciones no comprobadas Nuevamente, se trata de evitar crear demasiadas excepciones nuevas

¿Cuándo/Dónde manejar los resultados anormales y errores de aplicación? Errores de aplicación deben manejarse localmente El invocante es capaz, está preparado y obligado a reaccionar en forma inmediata, frente a errores de aplicación, nunca deben propagarse Resultados anormales: El invocante normalmente no puede hacer mucho en respuesta al mismo; típicamente (salvo que el invocante pueda hacer algo en relación al problema o si se está en el nivel más alto de un componente, que es responsable de manejar todos los resultados anormales) se pasan hacia arriba en la pila de invocación y son manejados en un nivel más alto (no directamente en donde se realizó la invocación) Señale las excepciones lo más pronto como sea posible (programación defensiva), sino el sistema puede agonizar y colapsar sin esperanzas de recuperación

¿Cómo responder a los eventos anormales? Tareas típicas de un sistema de manejo de excepciones: Registro (logging) y continuación: Los resultados anormales no necesariamente son malos desde el punto de vista del invocante. En el mejor caso puede registrarse las circunstancias y continuar con la operación normalmente Registro y limitación de los daños: Registro para los programadores encargados del mantenimiento. Medidas para limitar daños: cierre de conexiones, reset de transacciones, etc. A menudo sólo es afectada una sesión y el usuario tendrá que darse de alta nuevamente; en otros casos, debe cerrarse (shut down) el sistema entero Esperar (timeout) y/o repetir un número razonable de veces Reconfiguración si existen componentes redundantes. Ej.: reemplazo una base de datos remota no accesible con una local (backup)

Resultados luego del manejo de excepciones Cada método tiene sólo dos posibles salidas: Resultado normal, aún en el caso de errores de aplicación. El invocante ni se entera del uso de mecanismos de excepción, salvo por un tiempo de respuesta más largo Avería final y definitiva: el método falla, se tomaron todas las medidas para limitar daños y se realizaron todos los intentos de reparación, cualquier intento posterior es inútil. La única opción restante para el invocante es abortar

Una jerarquía de tipos de excepciones (Guerra et. al., 2004)

Referencias Burns, A. Wellings, A. "Sistemas de Tiempo Real y Lenguajes de Programación", Addison-Wesley (2003) Capítulo 6 Transparencias de Juan Antonio de la Puente http://polaris.dit.upm.es/~jpuente/ Siedersleben, J., Errors and Exceptions—Rights and Obligations, Lecture Notes in Computer Science, vol. 4119, pp. 275–287. Springer Berlin / Heidelberg, 2006 Guerra, P. A. de C., Filho, F. C., Pagano, V. A. y Rubira, C. M. F., Structuring exception handling for dependable component-based software systems. EUROMICRO, pp. 575–582, 2004.