6. Tratamiento de errores

Anuncio
Parte I: Programación en un lenguaje
orientado a objetos
,QWURGXFFLyQDORVOHQJXDMHVGHSURJUDPDFLyQ
'DWRV\H[SUHVLRQHV
(VWUXFWXUDVDOJRUtWPLFDV
'DWRVFRPSXHVWRV
0RGXODULGDG
7UDWDPLHQWRGHHUURUHV
• Excepciones. Bloques de tratamiento excepciones. La cláusula finally. Patrones de
tratamiento de excepciones. Jerarquía de las excepciones. Lanzar excepciones.
Usar nuestras propias excepciones
(QWUDGDVDOLGD
+HUHQFLD\3ROLPRUILVPR
www.istr.unican.es
© Michael González Harbour, 19/abr/16
1
81,9(56,'$'
'(&$17$%5,$
Excepciones
6RQXQPHFDQLVPRHVSHFLDOSDUDJHVWLRQDUHUURUHV
‡ 3HUPLWHQVHSDUDUHOWUDWDPLHQWRGHHUURUHVGHOFyGLJRQRUPDO
‡ (YLWDQTXHKD\DHUURUHVTXHSDVHQLQDGYHUWLGRV
‡ 3HUPLWHQSURSDJDUGHIRUPDDXWRPiWLFDORVHUURUHVGHVGHORV
PpWRGRVPiVLQWHUQRVDORVPiVH[WHUQRV
‡ 3HUPLWHQDJUXSDUHQXQOXJDUFRP~QHOWUDWDPLHQWRGHHUURUHVTXH
RFXUUHQHQYDULRVOXJDUHVGHOSURJUDPD
‡ (Q-DYDVRQFODVHVHVSHFLDOHV
/DVH[FHSFLRQHVVHODQ]DQSDUDLQGLFDUTXHKDRFXUULGRXQHUURU
‡ DXWRPiWLFDPHQWHFXDQGRHOVLVWHPDGHWHFWDXQHUURU
‡ H[SOtFLWDPHQWHFXDQGRHOSURJUDPDGRUORHVWDEOH]FD
(VWiQSUHVHQWHVHQORVOHQJXDMHVPiVPRGHUQRV
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
2
Conceptos asociados a las excepciones
/DQ]DU
‡ /DH[FHSFLyQVHODQ]DSDUDDYLVDUGHTXHKD\XQHUURU
- automáticamente
- o explícitamente con la instrucción throw
3URSDJDU
‡ /DH[FHSFLyQVHSURSDJDGHXQEORTXHDOVLJXLHQWHKDVWDVHWUDWD
7UDWDU
‡ (MHFXWDUODVLQVWUXFFLRQHVGHXQPDQHMDGRUGHH[FHSFLyQ
- para resolver la situación de error
0DQHMDGRU
‡ ,QVWUXFFLRQHVTXHVHHVFULEHQSDUDUHVROYHUXQHUURU
www.istr.unican.es
© Michael González Harbour, 19/abr/16
3
81,9(56,'$'
'(&$17$%5,$
Ej. de lanzamiento automático:
División por cero
import fundamentos.*;
public class DivisionPorCero {
public static void main(String[] args)
{
int i, j, div;
Lectura leer = new Lectura("Enteros");
leer.creaEntrada("i",0);
leer.creaEntrada("j",0);
leer.espera("introduce datos");
i=leer.leeInt("i");
j=leer.leeInt("j");
System.out.println("Divide...");
div = i/j;
System.out.println("i/j="+div);
} // fin main
} // fin DivisionPorCero
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
ĐƵĂŶĚŽ jǀĂůĞϬƐĞůĂŶnjĂ
ůĂĞdžĐĞƉĐŝſŶ
ArithmeticException
ĐƵĂŶĚŽƐĞůĂŶnjĂůĂĞdžĐĞƉĐŝſŶ
ĞƐƚĂůşŶĞĂŶŽƐĞĞũĞĐƵƚĂ
4
Propagación de excepciones
Se lanza excepción
m1()
}
m1() {
{
}
}
www.istr.unican.es
Se abortan instrucciones
restantes del bloque
¿Hay manejador?
NO
En el siguiente
bloque
main() {
SI
Se ejecuta
manejador
Fin excep., sigue siguiente bloque
© Michael González Harbour, 19/abr/16
5
81,9(56,'$'
'(&$17$%5,$
Propagación de excepciones
8QDOtQHDGHFyGLJRODQ]DXQDH[FHSFLyQ
(OEORTXHTXHFRQWLHQHHVDOtQHDGHFyGLJRVHDERUWDHQHVHSXQWR
6LHOEORTXHWUDWDHVDH[FHSFLyQHVGHFLUVLWLHQHXQPDQHMDGRUSDUD
HOODHOPDQHMDGRUVHHMHFXWD
‡ OD³YLGD´GHODH[FHSFLyQILQDOL]DHQHVWHSXQWR
6LQRWLHQHPDQHMDGRUODH[FHSFLyQVHSURSDJDDOEORTXHVXSHULRU
‡ TXHDVXYH]SRGUiWUDWDURGHMDUSDVDUODH[FHSFLyQ
6LODH[FHSFLyQDOFDQ]DHOEORTXHSULQFLSDOmain\pVWHWDPSRFRWUDWD
ODH[FHSFLyQHOSURJUDPDILQDOL]DFRQXQPHQVDMHGHHUURU
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
6
Ejemplo de propagación de excepciones
private static int divide(int a, int b) {
System.out.println("divide: antes de dividir");
int div = a/b;
System.out.println("divide: después de dividir");
return div;
}
private static void intermedio() {
System.out.println("intermedio: antes de divide");
int div = divide(2,0);
System.out.println("intermedio: resultado:" +div);
}
public static void main(String[] args) {
System.out.println("main: antes de intermedio");
intermedio();
System.out.println("main: después de intermedio");
}
www.istr.unican.es
© Michael González Harbour, 19/abr/16
7
81,9(56,'$'
'(&$17$%5,$
Ejemplo de propagación de excepciones
6LKD\GLYLVLyQSRUFHURODVDOLGDJHQHUDGDVHUi
main: antes de intermedio
intermedio: antes de divide
divide: antes de dividir
java.lang.ArithmeticException: / by zero
at Propaga.divide(Propaga.java:13)
at Propaga.intermedio(Propaga.java:20)
at Propaga.main(Propaga.java:26)
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
8
Bloques de tratamiento de excepciones
/DIRUPDJHQHUDOGHHVFULELUXQEORTXHHQHOTXHVHWUDWDQH[FHSFLRQHV
HV
eĞƐĞůŽďũĞƚŽƋƵĞ
ƌĞƉƌĞƐĞŶƚĂůĂĞdžĐĞƉĐŝſŶ
try {
instrucciones;
} catch (ClaseExcepción1 e) {
instrucciones de tratamiento;
} catch (ClaseExcepción2 | ClaseExcepción3 e) {
instrucciones de tratamiento;
}
/RV³catch´VHHYDO~DQSRURUGHQ
‡ XQDH[FHSFLyQVHWUDWDHQHOSULPHU³catch´SDUDHVDH[FHSFLyQR
SDUDXQDGHVXVVXSHUFODVHV
'HVGH-DYDVHSHUPLWHQP~OWLSOHVH[FHSFLRQHVHQXQ³catch´
www.istr.unican.es
© Michael González Harbour, 19/abr/16
9
81,9(56,'$'
'(&$17$%5,$
Ejemplo: propagación con bloque trycatch
(QHOHMHPSOR³SURSDJDFLyQGHH[FHSFLRQHV´DQWHULRUDxDGLPRVXQ
EORTXHtry-catchDOPpWRGRLQWHUPHGLR
private static void intermedio() {
try {
System.out.println("intermedio: antes de " +
"divide");
int div=divide(2,0);
System.out.println("intermedio: resultado:" +
div);
} catch (ArithmeticException e) {
System.out.println("intermedio: tratado error " + e);
}
}
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
10
Ejemplo: propagación con bloque trycatch
/DVDOLGDSRUFRQVRODTXHREWHQHPRVDKRUDHV
main: antes de intermedio
intermedio: antes de divide
divide: antes de dividir
intermedio: cazada ArithmeticException: / by zero
main: después de intermedio
‡ HQHVWHFDVRODH[FHSFLyQHVWUDWDGDSRUORTXH
- el programa NO finaliza de forma abrupta
- NO aparece un mensaje del sistema indicando que se ha producido una
excepción
www.istr.unican.es
© Michael González Harbour, 19/abr/16
11
81,9(56,'$'
'(&$17$%5,$
Tratamiento específico
7UDWDPLHQWR~QLFDPHQWHGHODH[FHSFLyQArithmeticException
try {
...;
} catch (ArithmeticException e) {
...;
}
(VSRVLEOHSRQHUXQWUDWDPLHQWRFRP~QSDUDFXDOTXLHUH[FHSFLyQ
try {
...;
} catch (Exception e) {
...;
}
‡ HVFyPRGRSHURQRHVUHFRPHQGDEOH\DTXHSXHGHRFXUULUXQ
WUDWDPLHQWRLQDGHFXDGRSDUDXQDH[FHSFLyQQRSUHYLVWD
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
12
La cláusula finally
3HUPLWHFUHDUXQEORTXHGHFyGLJRTXHVHHMHFXWDVLHPSUHGHVSXpVGHO
EORTXHtry-catch
‡ KD\DKDELGRH[FHSFLyQRQR
‡ LQFOXVRVLVHVDOHDFDXVDGHreturnbreakRcontinue
try {
operaciones;
} catch (ClaseExcepción1 e) {
tratamiento de la excepción;
} catch (ClaseExcepción2 e) {
tratamiento de la excepción;
} finally {
siempre;
}
‡ ODFOiXVXODfinallyHVRSFLRQDO
www.istr.unican.es
© Michael González Harbour, 19/abr/16
13
81,9(56,'$'
'(&$17$%5,$
Patrones de tratamiento de excepciones
6HJ~QODJUDYHGDGGHOHUURU
‡ OHYHVHQRWLILFDHOHUURUSHURODDSOLFDFLyQFRQWLQ~D
‡ JUDYHVHQRWLILFDHOHUURU\VHILQDOL]DXQDSDUWHGHODDSOLFDFLyQR
ODDSOLFDFLyQFRPSOHWD
‡ UHFXSHUDEOHVHUHLQWHQWDODRSHUDFLyQ
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
14
Patrones de tratamiento de excepciones
(VTXHPDGHWUDWDPLHQWRGHXQHUURUOHYH
try {
instrucciones
} catch (ClaseExcepción e) {
notificación del error leve
}
www.istr.unican.es
© Michael González Harbour, 19/abr/16
15
81,9(56,'$'
'(&$17$%5,$
Patrones de tratamiento de excepciones
(VTXHPDGHWUDWDPLHQWRGHXQHUURUJUDYH
try {
instrucciones
} catch (ClaseExcepción e) {
notificación del error grave
System.exit(-1); // finaliza la aplicación
}
(QRWUDVRFDVLRQHVVHILQDOL]DVyORHOPpWRGRFRQreturnRVHODQ]D
RWUDH[FHSFLyQFRQthrow
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
16
Patrones de tratamiento de excepciones
(VTXHPDGHWUDWDPLHQWRGHHUURUUHFXSHUDEOH
boolean correcto = false
do {
try {
instrucciones a reintentar
correcto = true
} catch (ClaseExcepción e) {
tratamiento
}
} while (!correcto);
www.istr.unican.es
© Michael González Harbour, 19/abr/16
17
81,9(56,'$'
'(&$17$%5,$
Ejemplo de error recuperable:
lee dos notas
double nota1, nota2;
boolean notasCorrectas = false;
Lectura lec = new Lectura("Lee notas");
lec.creaEntrada("Nota parcial 1",5.0);
lec.creaEntrada("Nota parcial 2",5.0);
do {
lec.esperaYCierra("Introduce notas");
try {
nota1=lec.leeDouble("Nota parcial 1");
nota2=lec.leeDouble("Nota parcial 2");
notasCorrectas = true; // sale del bucle
} catch (NumberFormatException e) {
// no muestra mensaje de error porque ya
// lo hace leeDouble
}
} while (!notasCorrectas);
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
18
Jerarquía de las excepciones
7KURZDEOH
VHSXHGHQ
WUDWDU
QRVHWUDWDQ
([FHSWLRQ
(UURU
QRHV
REOLJDWRULR
WUDWDUODV
5XQWLPH([FHSWLRQ
Excepción de Usuario
HV
REOLJDWRULR
WUDWDUODV
7DPELpQGHQRPLQDGDV
([FHSFLRQHVFRPSUREDGDV
RuntimeException de Usuario
7DPELpQGHQRPLQDGDV
([FHSFLRQHVQRFRPSUREDGDV
www.istr.unican.es
© Michael González Harbour, 19/abr/16
19
81,9(56,'$'
'(&$17$%5,$
Algunas excepciones RuntimeException
7DPELpQVHGHQRPLQDQH[FHSFLRQHVQRFRPSUREDGDV
ArithmeticException
(UURUDULWPpWLFR[
ArrayIndexOutOfBoundsException
ËQGLFHGHDUUD\IXHUDGHOtPLWHV
R! OHQJWK
ClassCastException
,QWHQWRGHFRQYHUWLUDXQDFODVHLQFR
UUHFWD
IndexOutOfBoundsException
ËQGLFHIXHUDGHOtPLWHVSHHQXQ
$UUD\/LVW
NegativeArraySizeException
7DPDxRGHDUUD\QHJDWLYR
NullPointerException
8VRGHXQDUHIHUHQFLDQXOD
NumberFormatException
)RUPDWRGHQ~PHURLQFRUUHFWR
StringIndexOutOfBounds
ËQGLFHXVDGRHQXQ6WULQJHVWiIXHUDGH
OtPLWHV
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
20
Lanzar excepciones
6HODQ]DQFRQODSDODEUDUHVHUYDGDthrow
throw new ClaseExcepción();
(QRFDVLRQHVSXHGHVHUPiVFRQYHQLHQWHXVDUHOFRQVWUXFWRUFRQXQ
VWULQJFRPRSDUiPHWUR
throw new ClaseExcepción("mensaje");
‡ TXHVLUYHSDUDGDULQIRUPDFLyQDGLFLRQDOVREUHODFDXVDGHOD
H[FHSFLyQ
(MHPSOR
if (clave==null) {
throw new NullPointerException("clave es nula");
}
www.istr.unican.es
© Michael González Harbour, 19/abr/16
21
81,9(56,'$'
'(&$17$%5,$
Lanzar la misma excepción
(QDOJXQDVRFDVLRQHVXQPDQHMDGRUSXHGHYROYHUDODQ]DUODPLVPD
H[FHSFLyQ
catch (ClaseExcepción e) {
parte del tratamiento de la excepción;
throw e;
}
‡ SXHGHVHU~WLOFXDQGRVHGHVHDUHDOL]DUHQHOPDQHMDGRUSDUWHGHO
WUDWDPLHQWRGHODH[FHSFLyQ
- y dejar que el resto del tratamiento le haga el método superior
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
22
Usar nuestras propias excepciones
(OSURJUDPDGRUSXHGHFUHDUVXVSURSLDVH[FHSFLRQHV\XWLOL]DUODVSDUD
LQGLFDUHUURUHV
public class MiExcepción extends Exception {}
/DVH[FHSFLRQHVFUHDGDVSRUHOSURJUDPDGRUTXHH[WLHQGHQDODFODVH
Exception
‡ VRQH[FHSFLRQHVFRPSUREDGDV
8QPpWRGRGRQGHVHODQ]DXQDH[FHSFLyQFRPSUREDGDGHEHUi
‡ WUDWDUODFRQXQEORTXHtry-catch
‡ RGHFODUDUHQVXFDEHFHUDTXHODODQ]DFRQXQDFOiXVXODthrows
www.istr.unican.es
© Michael González Harbour, 19/abr/16
23
81,9(56,'$'
'(&$17$%5,$
Sintaxis de la cláusula throws
public tipo nombreMétodo(parámetros)
throws ClaseExcepción1, ClaseExcepción2
{
declaraciones;
instrucciones; // lanzan las excepciones
}
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
24
Ejemplo de excepción propia
&ODVHTXHGHILQHODH[FHSFLyQ
public class NoQuieroTrabajar extends Exception {}
www.istr.unican.es
© Michael González Harbour, 19/abr/16
25
81,9(56,'$'
'(&$17$%5,$
Ejemplo de excepción propia
2SHUDFLyQTXHODQ]DODH[FHSFLyQ
public class Operador
{
public String trabaja(String diaSemana)
throws NoQuieroTrabajar
{
if (diaSemana.equals("Miercoles")) {
return "OK. voy a trabajar";
}
// si no es miércoles
throw new NoQuieroTrabajar();
}
}
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
26
Ejemplo de excepción propia
2SHUDFLyQTXHLQYRFDDtrabaja()\QRODWUDWD
public void mandaPepe() throws NoQuieroTrabajar
{
pepe.trabaja("viernes");
}
www.istr.unican.es
© Michael González Harbour, 19/abr/16
27
81,9(56,'$'
'(&$17$%5,$
Ejemplo de excepción propia
2SHUDFLyQTXHLQYRFDDtrabaja()\ODWUDWD
public void mandaJuan()
{
try {
juan.trabaja("miércoles");
} catch (NoQuieroTrabajar e) {
System.out.println
("Juan no quiere trabajar");
}
}
www.istr.unican.es
81,9(56,'$'
'(&$17$%5,$
© Michael González Harbour, 19/abr/16
28
Descargar