Excepciones

Anuncio
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 ();
}
Descargar