- Separación del código "regular" del de manejo de errores.
- Propagación de errores hacia la pila de métodos.
- Agrupación y diferenciación de tipos de errores.
Las excepciones proporcionan un mecanismo para separar los detalles de la lógica principal del programa, respecto a lo que hay que hacer cuando ocurre algo fuera de lo ordinario.
Considere el siguiente pseudocódigo para leer un archivo completo en la memoria:
readFile {
open the file;
determine its size;
allocate that much memory;
read the file into memory;
close the file;
}
- ¿Qué pasa si el archivo no se puede abrir?
- ¿Qué pasa si su longitud no puede ser determinada?
- ¿Qué pasa si no se puede obtener memoria suficiente para contenerlo?
- ¿Qué pasa si falla su lectura?
- ¿Qué pasa si el archivo no se puede cerrar?
errorCodeType readFile {
initialize errorCode = 0;
open the file;
if (theFileIsOpen) {
determine the length of the file;
if (gotTheFileLength) {
allocate that much memory;
if (gotEnoughMemory) {
read the file into memory;
if (readFailed){
errorCode = -1;
}
} else
errorCode = -2;
} else
errorCode = -3;
close the file;
if (theFileDidntClose && errorCode == 0)
errorCode = -4;
else
errorCode = errorCode and -4;
else
errorCode = -5;
return errorCode;
}
readFile {
try {
open the file;
determine its size;
allocate that much memory;
read the file into memory;
close the file;
} catch (fileOpenFailed) {
doSomething;
} catch (sizeDeterminationFailed) {
doSomething;
} catch (memoryAllocationFailed) {
doSomething;
} catch (readFailed) {
doSomething;
} catch (fileCloseFailed) {
doSomething;
}
}
Propagación de errores hacia la pila de métodos.
method1 {
call method2;
}
method2 {
call method3;
}
method3 {
call readFile;
}
Para la detección y manejo correspondiente utilizando técnicas tradicionales:
method1 {
errorCodeType error;
error = call method2;
if (error)
doErrorProcessing;
else
proceed;
}
errorCodeType method2 {
errorCodeType error;
error = call method3;
if (error)
return error;
else
proceed;
}
errorCodeType method3 {
errorCodeType error;
error = call readFile;
if (error)
return error;
else
proceed;
}
method1 {
try {
call method2;
} catch (exception e) {
doErrorProcessing;
}
}
method2 throws exception {
call method3;
}
method3 throws exception {
call readFile;
}
Agrupación y diferenciación de tipos de errores.
Un método puede considerar un manejador específico para una excepción determinada:
catch (FileNotFoundException e) {
...
}
catch (IOException e) {
...
}
catch (IOException e) {
// Output goes to System.err.
e.printStackTrace();
// Send trace to stdout.
e.printStackTrace(System.out);
}
// A (too) general exception handler
catch (Exception e) {
...
}