Una excepción es un acontecimiento, que ocurre durante la ejecución de un programa, que interrumpe el flujo normal de las instrucciones de programa.
Las excepciones proporcionan los medios de separar los detalles qué hacer cuando algo fuera de lo común sucede de "main logic" de un programa. En la programación tradicional, la detección de error, la divulgación, y la dirección conducen a menudo al código confuso del espagueti. Por ejemplo, considere el método del pseudocode aquí que lee un archivo entero en memoria:
readFile {
abra el archivo;
determine su tamaño;
asigne que mucha memoria;
lea el archivo en memoria;
cierre el archivo;
}
En el primer vistazo, esta función se parece bastante simple, pero no hace caso de todos los errores potenciales siguientes:
|
|
• ¿Qué sucede si el archivo no puede ser abierto?
• ¿Qué sucede si la longitud del archivo no puede ser
determinada?
• ¿Qué sucede si bastante memoria no puede ser asignada?
• ¿Qué sucede si leído falla?
• ¿Qué sucede si el archivo no puede ser cerrado?
Para manejar tales casos, la función readFile debe tener más código para hacer la detección de error, divulgando, y dirigiendo. Aquí está un ejemplo de lo que pudo parecer la función:
errorCodeType readFile {
inicialice el errorCode = 0;
abra el archivo;
si (theFileIsOpen) {
determine la longitud del archivo;
si (gotTheFileLength) {
asigne que mucha memoria;
si (gotEnoughMemory) {
lea el archivo en memoria;
si (readFailed) {
errorCode = -1;
}
} {
errorCode = -2;
}
} {
errorCode = -3;
}
cierre el archivo;
si (== 0 del errorCode del && del theFileDidntClose) {
errorCode = -4;
} {
errorCode = errorCode y -4;
}
} {
errorCode = -5;
}
errorCode de vuelta;
}
Hay tanto detección de error, divulgando, y volviendo aquí que las siete líneas originales del código están perdidas en el alboroto. Peor todavía, el flujo lógico del código también se ha perdido, así haciéndolo difícil de decir si el código está haciendo la cosa derecha: ¿El archivo realmente se es cerrado si la función no puede asignar bastante memoria? Es aún más difícil asegurarse de que el código continúa haciendo la cosa derecha cuando usted modifica el método tres meses después de la escritura él. Se divulgan muchos programadores solucionan este problema simplemente no haciendo caso de iterrors cuando sus programas se estrellan.
Las excepciones le permiten escribir el flujo principal de su código y tratar de los casos excepcionales a otra parte. Si la función readFile utilizara excepciones en vez de técnicas tradicionales de la error-gerencia, miraría más como el siguiente:
readFile {
intento {
abra el archivo;
determine su tamaño;
asigne que mucha memoria;
lea el archivo en memoria;
cierre el archivo;
} retén (fileOpenFailed) {
el doSomething;
} retén (sizeDeterminationFailed) {
el doSomething;
} retén (memoryAllocationFailed) {
el doSomething;
} retén (readFailed) {
el doSomething;
} retén (fileCloseFailed) {
el doSomething;
}
}
Observe que las excepciones no le ahorran el esfuerzo de hacer el trabajo de detectar, de divulgar, y de manejar errores, sino que le ayudan a organizar el trabajo más con eficacia.
Una segunda ventaja de excepciones es la capacidad de propagar el error que divulga encima de la pila de llamadas de métodos. Suponga que el método readFile es el cuarto método en una serie de llamadas jerarquizadas del método hechas por el programa principal: method1 llama method2, que llama method3, que finalmente llama readFile:
method1 {
llamada method2;
}
method2 {
llamada method3;
}
method3 {
llamada readFile;
}
Suponga también que method1 es el único método interesado en los errores que pudieron ocurrir dentro de la fuerza tradicional method2 y method3 de las técnicas de la error-notificacio'n de readFile. para propagar los códigos de error vueltos por ascendente readFile la pila de llamadas hasta que los códigos de error finalmente alcanzan el método de method1the solamente que está interesado en él:
method1 {
error del errorCodeType;
error = llamada method2;
si (error)
el doErrorProcessing;
proceda;
}
errorCodeType method2 {
error del errorCodeType;
error = llamada method3;
si (error)
error de vuelta;
proceda;
}
errorCodeType method3 {
error del errorCodeType;
error = llamada readFile;
si (error)
error de vuelta;
proceda;
}
Recuerde que el ambiente runtime de Java busca al revés a través de la pila de llamadas para encontrar cualquier método que esté interesado en la manipulación de una excepción particular. Un método puede duck cualquier excepción lanzada dentro de él, de tal modo permitiendo que un método más lejos encima de la pila de llamadas la coja. Por lo tanto, solamente los métodos que cuidan sobre errores tienen que preocuparse de detectar errores:
method1 {
intento {
llamada method2;
} retén (excepción e) {
el doErrorProcessing;
}
}
method2 lanza la excepción {
llamada method3;
}
method3 lanza la excepción {
llamada readFile;
}
Sin embargo, como el pseudocode demuestra, ducking una excepción requiere un cierto esfuerzo de parte de los métodos del intermediario. Cualquier excepción comprobada que se pueda lanzar dentro de un método se debe especificar en su cláusula de los tiros.
Porque todas las excepciones lanzadas dentro de un programa son objetos, el agrupar o el categorizar de excepciones es un resultado natural de la jerarquía de la clase. Un ejemplo de un grupo de clases relacionadas de la excepción en la plataforma de Java es ésos definida en java.ioIOException y sus descendientes. IOException es el más general y representa cualquier tipo de error que pueda ocurrir al realizar I/O. Sus descendientes representan errores más específicos. Por ejemplo, FileNotFoundException significa que un archivo no se podría situar en disco.
Un método puede escribir a los tratantes específicos que pueden manejar una excepción muy específica. La clase de FileNotFoundException no tiene ningún descendiente, así que el tratante siguiente puede manejar solamente un tipo de excepción:
retén (FileNotFoundException e) {
...
}
Un método puede coger una excepción basada en su grupo o tipo general especificando cualesquiera de los superclasses de la excepción en la declaración del retén. Por ejemplo, para coger todas las excepciones de I/O, sin importar su tipo específico, un tratante de la excepción especifica una discusión de IOException:
retén (IOException e) {
...
}
Este tratante podrá coger todas las excepciones de I/O, incluyendo FileNotFoundException, EOFException, etcétera. Usted puede encontrar los detalles sobre qué ocurrió preguntando la discusión pasada al tratante de la excepción. Por ejemplo, utilice el siguiente para imprimir el rastro de apilado:
coja (IOException e) {
e.printStackTrace(); //hecho salir va a
System.err.
e.printStackTrace(System.out); //envíe el rastro al
stdout.
}
Usted podría incluso instalar a un tratante de la excepción que maneja cualquier excepción con el tratante aquí:
coja (excepción e) tratante general de la excepción {//
A (también)
...
}
La clase de la excepción está cerca de la tapa de la jerarquía de la clase de THRowable. Por lo tanto, este tratante cogerá muchas otras excepciones además de las que piensen al tratante para coger. Usted puede desear manejar excepciones esta manera si todo usted quisiera que su programa hiciera, por ejemplo, es la impresión fuera de un mensaje de error para el usuario y después sale.
En la mayoría de las situaciones, sin embargo, usted quisiera que los tratantes de la excepción fueran tan específicos como sea posible. La razón es que es la primera cosa que lo hace una necesidad del tratante se determina ocurrió qué tipo de excepción antes de que pueda decidir sobre la mejor estrategia de la recuperación. En efecto, no cogiendo errores específicos, el tratante debe acomodar cualquier posibilidad. Los tratantes de la excepción que son lata demasiado general hacen código más error-prone cogiendo y manejando las excepciones que no fueron anticipadas por el programador y para cuáles no pensaron el tratante.
Según lo observado, usted puede crear grupos de
excepciones y manejar excepciones en una manera general, o usted puede
utilizar el tipo de excepción específico para distinguir excepciones
y para manejar excepciones en una manera exacta.
Online: 639 users browsing the articles directory
|
|