exceptions y assertions introducción a la terminología bloques: try, catch uso de finally bloques:...

Post on 03-Jan-2015

61 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Exceptions y Assertions Introducción a la terminología Bloques: try, catch Uso de finally Bloques: try, catch, finally Categorías de Exceptions Excepciones comunes Mis excepciones Manejo de Excepciones

Mecanismos que permiten detectar errores fácilmente sin escribir código especial para testear valores de retorno

Mantienen el código de manejo del error separado de el que genera el error

Las excepciones manejan situaciones inesperadas:₋ Archivo no encontrado, falla en la red, argumento

ilegal,etc

Las assertions documentan y testean los supuestos del programa

₋ “Esto nunca puede ser negativo”

Los testeos de assertions pueden eliminarse completamente del código, así no hace más lenta la ejecución

El término exception significa “condición excepcional” y se da cuando se altera el flujo normal de un programa.

Cuando ocurre un evento excepcional en Java, se dice que se lanza (throw) una excepción.

Al código que es responsable de hacer algo al respecto se le llama exception handler y es quien atrapa (catch) la excepción que se lanzó.

Por ejemplo, cuando se invoca un método que abre un archivo y este no puede ser abierto, la ejecución de ese método se termina y el código que maneja ese error se ejecuta.

Para esto se precisa una forma de decirle a la JVM que código ejecutar cuando cierta excepción es lanzada.

El try se utiliza para definir un bloque de código que puede lanzar una excepción

Luego se define una o más cláusulas catch que atrapen ciertas excepciones y definen el código manejador de la misma.

Si se tiene uno o más bloques catch, estos deben aparecer inmediatamente después de un bloque try.

Todos los bloques catch deben aparecer uno a continuación del otro

Los bloques try y catch no resuelven el problema de cómo limpiar los recursos luego de un error

Para resolver este problema, Java provee el bloque finally

Este bloque siempre se ejecuta luego del try, se haya lanzado una excepción o no

Es legal utilizar un bloque try sin un catch o finally

Un bloque try sin ambas da error de compilación

Los bloques catch deben aparecer siguiendo al bloque try

El bloque finally debe aparecer luego de los catch

Es legal omitir los catch o el finally pero no ambos

Existen dos grandes categorías de excepciones:

₋ Checked

₋ Unchecked

La clase Exception es la clase base que representa las excepciones checked.

La clase RuntimeException es la clase base que representa las excepciones uncheked.

La clase Error es la clase base que representa los errors.

ArithmeticException

NullPointerException

NegativeArraySizeException

ArrayIndexOutOfBoundsException

SecurityException

¿Por que los catch no son requeridos?

¿Que pasa cuando se lanza una excepción de un bloque try que no tiene catch asociado?

Si la excepción no es manejada en el bloque try-catch actual, es lanzada al método que lo invocó.

Si la excepción llega al método main y no es manejada, el programa termina de forma abrupta

A continuación vemos un ejemplo de como utilizar un bloque con un try sin hacer uso del catch.

En este ejemplo, se lee la primer línea de un archivo. Se utiliza una instancia de la clase BufferedReader para leer los datos del archivo. Como vemos, la variable utilizada es cerrada en el bloque finally.

Cuando se lanza una excepción, Java intentará encontrar la cláusula catch para el tipo correspondiente de excepción

Si no encuentra una, seguirá buscando por la jerarquía de herencia hacia arriba

Si no encuentra nada que matchee entonces la excepción se propaga por el stack de llamadas

Importante: los handlers para las excepciones más específicas deben colocarse entes que los más generales

Cuando se detecta que ha ocurrido un error podemos crear una excepción y lanzarla

if ( n < 0) {throw new Exception(“numero negativo”);

}

Para declarar que el método lanza una excepción hay que utilizar la palabra throws

Cuando se sobrescribe un método que lanza alguna excepción, éste puede lanzar las mismas excepciones o alguna subclase de las mismas.

No puede lanzar más de lo que lanza el método padre.

A continuación vemos un ejemplo en el cual el método toString para la clase Empleado, fue sobre escrito.

Para lanzar una excepción definida por el usuario, utilice la siguiente sintaxis:

throw new NombreClaseException();

Simpre instancie la exception en la misma línea donde se lanza, porque la excepción toma el número de línea dónde fue creada.

En el ejemplo anterior, definimos un método llamado divide, el cual recibe dos números.

Si el segundo número es cero, entonces se lanza una excepción de tipo MiException.

Como vemos, el método debe tener la declaración de dicha excepción.

Existen dos sintaxis permitidas para la sentencia assert

assert <<boolean_expression> ;

assert <<boolean_expression>> :<<detail_expression>> ;

Si la <<boolean_expression>> retorna false, entonces un AssertionError es lanzado.

El segundo argumento es convertido a String y usado como texto descriptivo en el mensaje de AssertionError.

Para la documentación y verificación de supuestos asumidos en la lógica de un método:

₋ Invariantes internas₋ Control de flujo invariante₋ PostCondiciones e invariantes de clase

No es recomendado para el control de precondiciones en métodos públicos

if ( x > 0 ){

//……..

}

else{

//……..

}

if ( x > 0 ){//……..}else{assert(x>=0);//……..}

public Object pop(){int size = this.getElementCount();if(size == 0){

throw new RuntimeException(“Error..”)}//hace el trabajo de pop//test postcondicionassert (this.getElementCount() == size-1 )return value;

}

Si las assertion están deshabilitadas, el código ejecuta tan rápido como si no estuvieran.

Assertion están deshabilitadas por defecto₋ Para habilitarlas

₋ java -enableassertions ₋ java -ea

₋ Para dehabilitarlas₋ java -disableassertions₋ java -da

Comando Que significa?

java -eaJava –enableassertions

Habilita assertions

java -dajava –disableassertions

Deshabilita assertions

java –ea:com.foo.Bar Habilita asserts en la clase com.foo.Bar

java –ea:com.foo Habilita asserts en paquete com.foo.Bar y sus subpaquetes

java –ea –dsa Habilita asserts en general, deshabilita asserts en clases system

java –ea –da:com.foo Habilita asserts en general, deshabilita asserts en paquete com.foo y sus subpaquetes.

Exceptions y Assertions: diferencias Introducción a la terminología Bloques: try, catch Uso de finally Bloques: try, catch, finally Categorías de Exceptions Excepciones comunes Mis excepciones Manejo de Excepciones Ejemplos

Thinking in Java₋ Bruce Eckel

The Java Tutorial₋ http://download.oracle.com/javase/tutorial/essential

/exceptions/

Introduction to Java Exception Handling₋ http://tutorials.jenkov.com/java-exception-handling/

index.html

top related