Gestión eficiente de errores: Excepciones en Java.

30
Gestión eficiente de Gestión eficiente de errores: Caso práctico errores: Caso práctico de Excepciones en Java de Excepciones en Java PUA Mascheroni, Maximiliano Agustín PUA Mascheroni, Maximiliano Agustín

description

- como responder a las excepciones que se produzcan- como crear métodos que puedan ignorar esas excepciones, dejando que sea otra clase la que las maneje- como usar métodos que provoquen ellos mismos excepciones- como podemos crear excepciones propias

Transcript of Gestión eficiente de errores: Excepciones en Java.

Page 1: Gestión eficiente de errores: Excepciones en Java.

Gestión eficiente de Gestión eficiente de errores: Caso práctico de errores: Caso práctico de

Excepciones en Java Excepciones en Java

PUA Mascheroni, Maximiliano AgustínPUA Mascheroni, Maximiliano Agustín

Page 2: Gestión eficiente de errores: Excepciones en Java.

Tratamiento de problemas en tiempo de ejecución

En el mundo de la programación hay En el mundo de la programación hay algo que siempre ocurre: algo que siempre ocurre: los errores los errores en los programas. en los programas. En algunos casos En algunos casos estos hasta resultan inevitables, por estos hasta resultan inevitables, por ejemplo por algún problema de tipeo: ejemplo por algún problema de tipeo: se ingresan letras cuando el programa se ingresan letras cuando el programa espera recibir números, escribir alguna espera recibir números, escribir alguna letra de más, etc. letra de más, etc.

Page 3: Gestión eficiente de errores: Excepciones en Java.
Page 4: Gestión eficiente de errores: Excepciones en Java.

DefiniciónDefinición

Una Una excepción excepción es un evento que ocurre es un evento que ocurre durante la ejecución del programa que durante la ejecución del programa que interrumpe el flujo normal de las interrumpe el flujo normal de las sentencias, es decir, algo que altera la sentencias, es decir, algo que altera la ejecución normal. Cuando hablamos del ejecución normal. Cuando hablamos del manejo de excepciones, nos referimos a manejo de excepciones, nos referimos a un modo de tratar distintos tipos de un modo de tratar distintos tipos de errores que impiden que un programa se errores que impiden que un programa se ejecute correctamente. ejecute correctamente.

Page 5: Gestión eficiente de errores: Excepciones en Java.

Veremos:Veremos:

- como responder a las excepciones que se produzcan- como responder a las excepciones que se produzcan- como crear métodos que puedan ignorar esas excepciones, dejando - como crear métodos que puedan ignorar esas excepciones, dejando

que sea otra clase la que las manejeque sea otra clase la que las maneje- como usar métodos que provoquen ellos mismos excepciones- como usar métodos que provoquen ellos mismos excepciones- como podemos crear excepciones propias - como podemos crear excepciones propias

Page 6: Gestión eficiente de errores: Excepciones en Java.

En la mayoría de los lenguajes de En la mayoría de los lenguajes de programación utilizábamos programación utilizábamos condicionales para avisarle al usuario condicionales para avisarle al usuario que se ha producido algún tipo de que se ha producido algún tipo de error. error.

Por ejemplo: si deseamos realizar Por ejemplo: si deseamos realizar una división, teníamos que una división, teníamos que asegurarnos de que el denominador asegurarnos de que el denominador sea distinto de 0. sea distinto de 0.

Page 7: Gestión eficiente de errores: Excepciones en Java.

Entonces un ejemplo de pseudocódigo para Entonces un ejemplo de pseudocódigo para esta situación sería:esta situación sería:

Comienzo;Comienzo;Escribir “Ingrese numerador”; Escribir “Ingrese numerador”; Leer num;Leer num;Escribir “Ingrese denominador”;Escribir “Ingrese denominador”;Leer deno;Leer deno;si (deno <> 0){si (deno <> 0){

resultado = num/deno;resultado = num/deno;Escribir resultado;Escribir resultado;

}sino{}sino{Escribir “Denominador debe ser distinto de Escribir “Denominador debe ser distinto de 0”;0”;

}//fin si}//fin siFin;Fin;

Page 8: Gestión eficiente de errores: Excepciones en Java.

Comprobación de estados La comprobación de estados hace

referencia a las condiciones que deben cumplir los estados de ciertos objetos antes o después de realizar una operación. Con la comprobación de estados se busca evitar o minimizar la posibilidad de que un objeto quede en estado inválido, por no haber terminado correctamente una tarea que afecta al objeto. Este problema puede ser enfocado de dos maneras: en forma conservadora, o en forma optimista.

Page 9: Gestión eficiente de errores: Excepciones en Java.

Enfoque conservador Al enfoque conservador de comprobación de

estados se lo puede caracterizar como: comprobar primero, actuar después. La idea de este enfoque es comprobar que se cumple la precondición y realizar la tarea solamente en ese caso. Este enfoque abarca tres tipos de soluciones:- rechazo: si no se cumplen las condiciones no se realiza la operación, enviando algún tipo de aviso al usuario o al módulo invocante. - suspensión protegida: se espera a que la precondición sea verdadera para realizar la acción. - plazos temporales: corresponden a una suspensión protegida, pero limitada a un intervalo de tiempo (en contextos concurrentes) o a un número de intentos, pasando luego al rechazo.

Page 10: Gestión eficiente de errores: Excepciones en Java.

Enfoque OptimistaEnfoque Optimista

El enfoque optimista consiste en El enfoque optimista consiste en intentar primero, analizar después. Se intentar primero, analizar después. Se realiza la operación realiza la operación independientemente de que se pueda independientemente de que se pueda hacer o no. Y si durante la ejecución hacer o no. Y si durante la ejecución surge un problema o al final de la surge un problema o al final de la misma no se cumple una poscondición misma no se cumple una poscondición necesaria, se intenta resolver el necesaria, se intenta resolver el inconveniente.inconveniente.

Page 11: Gestión eficiente de errores: Excepciones en Java.

Pero cuando hablamos de Java existe una Pero cuando hablamos de Java existe una técnica mejor para trabajar con técnica mejor para trabajar con circunstancias excepcionales que puedan circunstancias excepcionales que puedan producirse al ejecutarse un programa. producirse al ejecutarse un programa. Consiste en el uso de un conjunto de clases Consiste en el uso de un conjunto de clases que se denominan justamente así, que se denominan justamente así, EXCEPTIONS. Éstas permiten manejar EXCEPTIONS. Éstas permiten manejar errores cuando se produzcan y errores cuando se produzcan y probablemente darles una soluciónprobablemente darles una solución

Por lo tanto, podemos decir que Java cuenta Por lo tanto, podemos decir que Java cuenta con su propio sistema para el manejo de con su propio sistema para el manejo de errores y condiciones excepcionales en la errores y condiciones excepcionales en la ejecución de programas. Una serie de ejecución de programas. Una serie de características que realizan comprobaciones características que realizan comprobaciones en tiempo de ejecución del programa y que en tiempo de ejecución del programa y que utilizan dichas clases.utilizan dichas clases.

Page 12: Gestión eficiente de errores: Excepciones en Java.

Ventajas del manejo de Ventajas del manejo de ExcepcionesExcepciones

Separar el Manejo de Errores del Código Separar el Manejo de Errores del Código "Normal“. Estará en una zona separada donde "Normal“. Estará en una zona separada donde podremos tratar las excepciones como un código podremos tratar las excepciones como un código ‘especial’.‘especial’.

Propagar los Errores sobre la Pila de Llamadas. Propagar los Errores sobre la Pila de Llamadas. Podemos propagar el error a la primera función Podemos propagar el error a la primera función que llamó a las diversas funciones hasta que que llamó a las diversas funciones hasta que llegamos al error.llegamos al error.

Agrupar Errores y Diferenciación. Gracias a esto Agrupar Errores y Diferenciación. Gracias a esto tenemos todos los posibles errores juntos y tenemos todos los posibles errores juntos y podemos pensar una manera de tratarlos que sea podemos pensar una manera de tratarlos que sea adecuado.adecuado.

Page 13: Gestión eficiente de errores: Excepciones en Java.
Page 14: Gestión eficiente de errores: Excepciones en Java.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Exception.html http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Exception.html

Page 15: Gestión eficiente de errores: Excepciones en Java.

Vamos a ver un primer ejemplo de excepción Vamos a ver un primer ejemplo de excepción muy simple, en el cual tenemos un programa muy simple, en el cual tenemos un programa Java que compila correctamente, pero en el Java que compila correctamente, pero en el momento en el que lo ejecutamos encuentra momento en el que lo ejecutamos encuentra algún tipo de problema.algún tipo de problema.

public class ArraySimple {public class ArraySimple {

public static void main(String[] arguments) {public static void main(String[] arguments) {

String[] carreras = { "LSI", "CE", "LAE" };String[] carreras = { "LSI", "CE", "LAE" };

System.out.println(carreras[3]);System.out.println(carreras[3]);

}}

}}

Page 16: Gestión eficiente de errores: Excepciones en Java.

Veamos un nuevo ejemplo.Veamos un nuevo ejemplo.

public class Sumador {public class Sumador { public static void main(String[] public static void main(String[]

arguments) {arguments) { float sum = 0;float sum = 0; for (int i = 0; i < arguments.length; i++) {for (int i = 0; i < arguments.length; i++) { sum = sum + sum = sum +

Float.parseFloat(arguments[i]);Float.parseFloat(arguments[i]); }} System.out.println("Esos números suman System.out.println("Esos números suman

un total de: " + sum);un total de: " + sum); }}}}

Page 17: Gestión eficiente de errores: Excepciones en Java.

Capturar y Manejar Excepciones

try: etry: el primer paso en la escritura de un l primer paso en la escritura de un manejador de excepciones es poner la manejador de excepciones es poner la sentencia Java dentro de la cual se puede sentencia Java dentro de la cual se puede producir la excepción dentro de un bloque producir la excepción dentro de un bloque trytry. Es el bloque de código donde se prevé . Es el bloque de código donde se prevé que se genere una excepción. que se genere una excepción.

catch: escatch: es si se produce la excepción, en si se produce la excepción, en este bloque irá el código que se debe este bloque irá el código que se debe ejecutar en tal caso.ejecutar en tal caso.

• • Si no se produce la excepción, el código se Si no se produce la excepción, el código se ejecutará normalmente.ejecutará normalmente.

Page 18: Gestión eficiente de errores: Excepciones en Java.
Page 19: Gestión eficiente de errores: Excepciones en Java.

Entonces, la aplicación anterior quedará modificada con los Entonces, la aplicación anterior quedará modificada con los bloques try-catch de la siguiente manera:bloques try-catch de la siguiente manera:

public class NuevoSumador {public class NuevoSumador { public static void main(String[] arguments) {public static void main(String[] arguments) { float sum = 0;float sum = 0; for (int i = 0; i < arguments.length; i++) {for (int i = 0; i < arguments.length; i++) { try {try { sum = sum + Float.parseFloat(arguments[i]);sum = sum + Float.parseFloat(arguments[i]); } catch (NumberFormatException e) {} catch (NumberFormatException e) { System.out.println(arguments[i] + " no es un System.out.println(arguments[i] + " no es un

número.");número."); }} }} System.out.println("Esos números suman un total de " + System.out.println("Esos números suman un total de " +

sum);sum); }}}}

Si se produce la excepción en el bloque try al intentar convertir Si se produce la excepción en el bloque try al intentar convertir a float un carácter no válido, el bloque catch se encargará de a float un carácter no válido, el bloque catch se encargará de capturar la excepción y devolverle un mensaje al usuario.capturar la excepción y devolverle un mensaje al usuario.

Page 20: Gestión eficiente de errores: Excepciones en Java.

Hemos visto que podemos capturar una excepción y Hemos visto que podemos capturar una excepción y poder manejarla utilizando los bloques try-catch. Sin poder manejarla utilizando los bloques try-catch. Sin embargo, también nos permiten capturar y tratar embargo, también nos permiten capturar y tratar más de una excepción de distintos tipos, incluso si más de una excepción de distintos tipos, incluso si son lanzadas por declaraciones diferentes, es decir, son lanzadas por declaraciones diferentes, es decir, no tiene porque haber un único catch. En este caso, no tiene porque haber un único catch. En este caso, tendremos tantos catchs como excepciones tendremos tantos catchs como excepciones queramos lanzar. queramos lanzar.

Continuaremos con otra aplicación muy sencilla, que Continuaremos con otra aplicación muy sencilla, que toma dos argumentos de tipo Integer, ingresados toma dos argumentos de tipo Integer, ingresados como parámetros del método main y los como parámetros del método main y los utilizaremos para llevar a cabo una división. Pero a utilizaremos para llevar a cabo una división. Pero a diferencia del ejemplo anterior, ésta aplicación debe diferencia del ejemplo anterior, ésta aplicación debe ser capaz de poder tratar con dos problemas ser capaz de poder tratar con dos problemas potenciales en las entradas de los usuarios. Por un potenciales en las entradas de los usuarios. Por un lado que los argumentos sean no numéricos, y por lo lado que los argumentos sean no numéricos, y por lo tanto no van a poder ser operados; por el otro, que tanto no van a poder ser operados; por el otro, que el denominador sea 0 y por ende, no se pueda el denominador sea 0 y por ende, no se pueda realizar la división.realizar la división.

Page 21: Gestión eficiente de errores: Excepciones en Java.

public class Division {public class Division { public static void main(String[] arguments) {public static void main(String[] arguments) { if (arguments.length == 2) {if (arguments.length == 2) { int resultado = 0;int resultado = 0; try {try { resultado = Integer.parseInt(arguments[0]) /resultado = Integer.parseInt(arguments[0]) / Integer.parseInt(arguments[1]);Integer.parseInt(arguments[1]); System.out.println(arguments[0] + " dividido por "System.out.println(arguments[0] + " dividido por " + arguments[1] + " igual a " + resultado);+ arguments[1] + " igual a " + resultado); } catch (NumberFormatException e) {} catch (NumberFormatException e) { System.out.println("Ambos argumentos deben ser System.out.println("Ambos argumentos deben ser

números.");números."); } catch (ArithmeticException e) {} catch (ArithmeticException e) { System.out.println("Error: " + e.getMessage());System.out.println("Error: " + e.getMessage()); }} }} }}}}

El método getMessage() nos devuelve el mensaje del tipo de error El método getMessage() nos devuelve el mensaje del tipo de error de la excepción.de la excepción.

Page 22: Gestión eficiente de errores: Excepciones en Java.

Cuando estamos tratando con múltiples Cuando estamos tratando con múltiples excepciones usando try-catch, seguro que excepciones usando try-catch, seguro que van a haber ocasiones en las que queramos van a haber ocasiones en las que queramos que el programa haga algo al final del que el programa haga algo al final del bloque, tanto si ocurre una excepción, bloque, tanto si ocurre una excepción, como no. Podemos hacer esto utilizando un como no. Podemos hacer esto utilizando un tercer bloque denominado tercer bloque denominado finally,finally, que nos que nos proporciona un mecanismo que permite a proporciona un mecanismo que permite a sus métodos limpiarse a si mismos sin sus métodos limpiarse a si mismos sin importar lo que sucede dentro del bloque importar lo que sucede dentro del bloque trytry. Se utiliza el bloque . Se utiliza el bloque finally finally para cerrar para cerrar ficheros o liberar otros recursos del sistema ficheros o liberar otros recursos del sistema después de que ocurra una excepción.después de que ocurra una excepción.

Page 23: Gestión eficiente de errores: Excepciones en Java.
Page 24: Gestión eficiente de errores: Excepciones en Java.

Agregando el bloque finally al ejemplo anterior, nos aseguramos de Agregando el bloque finally al ejemplo anterior, nos aseguramos de que se imprima el mensaje colocado dentro del bloque al finalizar el que se imprima el mensaje colocado dentro del bloque al finalizar el programa.programa.

public class Division {public class Division { public static void main(String[] arguments) {public static void main(String[] arguments) { if (arguments.length == 2) {if (arguments.length == 2) { int resultado = 0;int resultado = 0; try {try { resultado = Integer.parseInt(arguments[0]) /resultado = Integer.parseInt(arguments[0]) / Integer.parseInt(arguments[1]);Integer.parseInt(arguments[1]); System.out.println(arguments[0] + " dividido por "System.out.println(arguments[0] + " dividido por " + arguments[1] + " igual a " + resultado);+ arguments[1] + " igual a " + resultado); } catch (NumberFormatException e) {} catch (NumberFormatException e) { System.out.println("Ambos argumentos deben ser System.out.println("Ambos argumentos deben ser

números.");números."); } catch (ArithmeticException e) {} catch (ArithmeticException e) { System.out.println("Error: " + e.getMessage());System.out.println("Error: " + e.getMessage()); }} finally {finally { System.out.println("El bloque try-catch ha finalizado. Se System.out.println("El bloque try-catch ha finalizado. Se

ejecuta siempre finally");ejecuta siempre finally"); }} }} }}}}

Page 25: Gestión eficiente de errores: Excepciones en Java.

Lanzamiento de Lanzamiento de ExcepcionesExcepciones

Muchas veces el programador dentro de un Muchas veces el programador dentro de un determinado método deberá comprobar si alguna determinado método deberá comprobar si alguna condición de excepción se cumple, y si es así condición de excepción se cumple, y si es así lanzarla. Para ello se utilizan las palabras lanzarla. Para ello se utilizan las palabras reservadas reservadas throwthrow y  y throwsthrows..

Por una parte la excepción se lanza mediante la Por una parte la excepción se lanza mediante la sentencia sentencia thrownthrown, esta sería la sintaxis:, esta sería la sintaxis:

if ( condicion_de_excepcion = = true) throw new if ( condicion_de_excepcion = = true) throw new miExcepcion();miExcepcion();

Page 26: Gestión eficiente de errores: Excepciones en Java.

Los constructores de excepciones son Los constructores de excepciones son siempre dos por defecto: uno sin siempre dos por defecto: uno sin parámetros, y otro que recibe una parámetros, y otro que recibe una cadena de caracteres que se usa para cadena de caracteres que se usa para enviar información pertinente, como enviar información pertinente, como muestra el ejemplo que sigue:muestra el ejemplo que sigue:

Ejemplo:Ejemplo:

if (p = = null) throw new NullPointerException();if (p = = null) throw new NullPointerException();

if (p = = null) throw new NullPointerException("Puntero if (p = = null) throw new NullPointerException("Puntero nulo");nulo");

Page 27: Gestión eficiente de errores: Excepciones en Java.

El propósito es disparar una excepción de El propósito es disparar una excepción de una clase diferente por cada tipo de una clase diferente por cada tipo de anomalía. En general es la propia clase de anomalía. En general es la propia clase de excepción la que se usa para determinar excepción la que se usa para determinar de qué error se trata por parte de quien la de qué error se trata por parte de quien la recibe. Por eso es especialmente recibe. Por eso es especialmente importante elegir un buen nombre para la importante elegir un buen nombre para la clase de excepción. En Java, en la clase de excepción. En Java, en la declaración del método se indica qué declaración del método se indica qué excepciones arroja, de modo que el cliente excepciones arroja, de modo que el cliente de la clase sepa qué excepciones debe de la clase sepa qué excepciones debe manejar. Para ello se usa la cláusula manejar. Para ello se usa la cláusula mencionada throws. La idea es que un mencionada throws. La idea es que un método lance una excepción a otro método lance una excepción a otro método que lo llama desde la misma clase método que lo llama desde la misma clase o desde cualquier otra. o desde cualquier otra.

Page 28: Gestión eficiente de errores: Excepciones en Java.

public static void main(String [] args){public static void main(String [] args){ try{try{ metodoX();metodoX(); }} catch(Exception e){catch(Exception e){ System.out.println("Se produjo un error en el System.out.println("Se produjo un error en el

metodo");metodo"); }}}}public static void metodoX() throws Exception{public static void metodoX() throws Exception{ Scanner teclado = new Scanner(System.in);Scanner teclado = new Scanner(System.in); System.out.println("Ingrese numero: ");System.out.println("Ingrese numero: "); String string = teclado.next();String string = teclado.next(); int x = Integer.parseInt(string);int x = Integer.parseInt(string); System.out.println("El valor es: "+x);System.out.println("El valor es: "+x); }}}}

Page 29: Gestión eficiente de errores: Excepciones en Java.
Page 30: Gestión eficiente de errores: Excepciones en Java.

Excepciones PropiasExcepciones Propias Como vimos, el lenguaje Java proporciona las clases Como vimos, el lenguaje Java proporciona las clases

que manejan casi cualquier tipo de excepción. Sin que manejan casi cualquier tipo de excepción. Sin embargo, podemos imaginar situaciones en la que embargo, podemos imaginar situaciones en la que se producen excepciones que no están dentro del se producen excepciones que no están dentro del lenguaje. Para este tipo de situaciones, el lenguaje. Para este tipo de situaciones, el programador puede crear sus propias clases de programador puede crear sus propias clases de excepciones, indicando con precisión el tipo excepciones, indicando con precisión el tipo particular de error que un método puede elevar.particular de error que un método puede elevar.

Para crear una Clase de Excepcion propia seguimos Para crear una Clase de Excepcion propia seguimos la siguiente estructura:la siguiente estructura:

public class MiExcepcion extends Exception {public class MiExcepcion extends Exception { public MiExcepcion(String msg) {public MiExcepcion(String msg) { super(msg);super(msg); }}}}