Excepciones LSUB GSYC 10 de febrero de 2016 (cc) 2016 Laboratorio de Sistemas, Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Reconocimiento NoComercial - SinObraDerivada (by-nc-nd). Para obtener la licencia completa, véase http://creativecommons.org/licenses/by-sa/2.1/es. También puede solicitarse a Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. Excepciones I Gestión de errores para casos excepcionales. Hay que usarlas cuando: I I Nos podamos recuperar de un error. Cuando tengamos que hacer limpieza. I Son clases. I Hay varios tipos, trataremos todas como excepciones. I Las hay explı́citas (checked) e implı́citas (unchecked). I OJO: en Java nos puede saltar una excepción en cualquier momento Excepciones p u b l i c c l a s s Main { p u b l i c s t a t i c void hazOtraCosa ( ) { throw new R u n t i m e E x c e p t i o n ( ” Bang ! ” ) ; } p u b l i c s t a t i c void hazAlgo ( ) { try { hazOtraCosa ( ) ; System . o u t . p r i n t l n ( ” o t r a c o s a h e c h a ” ) ; } catch ( Exception e ) { System . e r r . p r i n t l n ( ” Oops : ” + e ) ; } } p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) { hazAlgo ( ) ; System . o u t . p r i n t l n ( ” a l g o h e c h o ” ) ; } } Excepciones Salida: Oops : j a v a . l a n g . R u n t i m e E x c e p t i o n : Bang ! a l g o hecho Excepciones p u b l i c c l a s s Main { p u b l i c s t a t i c void hazOtraCosa ( ) { throw new R u n t i m e E x c e p t i o n ( ” Bang ! ” ) ; } p u b l i c s t a t i c void hazAlgo ( ) { try { hazOtraCosa ( ) ; System . o u t . p r i n t l n ( ” o t r a c o s a h e c h a ” ) ; } catch ( RuntimeException e ) { System . e r r . p r i n t l n ( ” Oops : ” + e ) ; throw e ; } } p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) { hazAlgo ( ) ; System . o u t . p r i n t l n ( ” a l g o h e c h o ” ) ; } } Excepciones Salida: Oops : j a v a . l a n g . R u n t i m e E x c e p t i o n : Bang ! E x c e p t i o n i n t h r e a d ” main ” j a v a . l a n g . R u n t i m e E x c e p t i o n : Bang ! a t e x . Main . h a z O t r a C o s a ( Main . j a v a : 6 ) a t e x . Main . h a z A l g o ( Main . j a v a : 1 1 ) a t e x . Main . main ( Main . j a v a : 2 0 ) Excepciones Tres tipos que derivan de la clase Throwable: I Exception: cualquier situación excepcional en nuestro programa de la que nos podamos recuperar. I Error: errores en el sistema (e.g. IO error). I RuntimeException: situaciones internas al programa de las que puede que no nos podamos recuperar (e.g. un bug). Deriva de Exception. Excepciones c l a s s H a z E x c e p t i o n extends E x c e p t i o n { HazException ( S t r i n g s ){ super ( s ) ; } }; Excepciones p u b l i c s t a t i c void hazOtraCosa ( ) throws HazException { throw new H a z E x c e p t i o n ( ” Bang ! ” ) ; } p u b l i c s t a t i c void hazAlgo ( ) { try { hazOtraCosa ( ) ; System . o u t . p r i n t l n ( ” o t r a c o s a h e c h a ” ) ; /∗ o j o : e l o r d e n de l o s c a t c h i m p o r t a ! ∗/ } catch ( RuntimeException e ) { System . e r r . p r i n t l n ( ”RT : ” + e ) ; } catch ( Error e ) { System . e r r . p r i n t l n ( ” E r r : ” + e ) ; } catch ( HazException e ) { System . e r r . p r i n t l n ( ” Haz e x : ” + e ) ; } } Código Salida: a l g o hecho Haz ex : ex . H a z E x c e p t i o n : Bang ! Checked Exception Exception: I La excepción forma parte de la interfaz pública del método: los métodos tienen que especificar las excepciones que pueden levantar (throws). I Catch or Specify Requirement. I El compilador obliga a manejar la excepción. I Se denominan “checked exceptions”. Unchecked Exception Error y RuntimeException: I El compilador no obliga a manejar estas excepciones (aunque las podemos/debemos manejar). I No forman parte de la interfaz pública del método que las puede provocar. I Se denominan “unchecked exceptions”. I RuntimeException: Arithmetic Exception, NullPointer Exception, IndexOutOfBounds Exception ... I Error: IOError, AssertionError ... I Por tanto, manejar las excepciones que se especifican en la cabecera no garantiza que manejemos todas las posibles excepciones que se pueden elevar al invocar un método. Excepciones ¿Qué podemos hacer al manejarla? I Imprimir la pila con el método printStackTrace(). I Relanzan la excepción con throw. I Podemos ejecutar código incondicionalmente con finally. Finally try { connect ( ) ; query ( ) ; } catch ( Exception e ) { System . e r r . p r i n t l n ( ” e r r o r , q u e r y f a i l e d : ” + e ) ; }finally { disconnect (); }