1. Información general
En este tutorial, nos centraremos en el controlador de excepciones globales en Java. Primero discutiremos los conceptos básicos de las excepciones y el manejo de excepciones. Luego, echaremos un vistazo completo al controlador de excepciones global.
Para obtener más información sobre las excepciones en general, eche un vistazo a Manejo de excepciones en Java.
2. ¿Qué es una excepción?
Una excepción es una condición anormal que surge en una secuencia de código en tiempo de ejecución o en tiempo de compilación. Esta condición anormal surge cuando un programa viola las restricciones semánticas del lenguaje de programación Java.
Las excepciones que ocurren durante el tiempo de compilación son excepciones marcadas . Estas excepciones son subclases directas de la clase Exception y es necesario manejar estas excepciones en el código.
Otro tipo de excepciones son las excepciones no marcadas . El compilador no comprueba estas excepciones durante el tiempo de compilación. Estas excepciones son subclases directas de la clase RuntimeException que amplía la clase Exception .
Además, no es necesario manejar excepciones de tiempo de ejecución en el código.
3. Controladores de excepciones
Java es un lenguaje de programación robusto. Una de las características principales que lo hace robusto es el marco de manejo de excepciones. Significa que el programa puede salir con gracia en el momento del error, en lugar de simplemente fallar.
Siempre que se produce una excepción, un E Xception objeto se construye , ya sea por la JVM o por el método de ejecutar el código. Este objeto contiene la información sobre la excepción. El manejo de excepciones es una forma de manejar este objeto de excepción .
3.1. El bloque try-catch
En el siguiente ejemplo, el bloque try contiene el código que puede generar una excepción. El bloque de captura contiene la lógica para manejar esta excepción.
El bloque catch captura el objeto Exception que genera el código en el bloque try :
String string = "01, , 2010"; DateFormat format = new SimpleDateFormat("MM, dd, yyyy"); Date date; try { date = format.parse(string); } catch (ParseException e) { System.out.println("ParseException caught!"); }
3.2. El lanzamiento y los lanzamientos Palabras clave
Alternativamente, el método también puede optar por lanzar la excepción en lugar de manejarla. Eso significa que la lógica para manejar el objeto Exception está escrita en otro lugar.
Por lo general, el método de llamada maneja la excepción en tales casos:
public class ExceptionHandler { public static void main(String[] args) { String strDate = "01, , 2010"; String dateFormat = "MM, dd, yyyy"; try { Date date = new DateParser().getParsedDate(strDate, dateFormat); } catch (ParseException e) { System.out.println("The calling method caught ParseException!"); } } } class DateParser { public Date getParsedDate(String strDate, String dateFormat) throws ParseException { DateFormat format = new SimpleDateFormat(dateFormat); try { return format.parse(strDate); } catch (ParseException parseException) { throw parseException; } } }
A continuación, consideraremos el controlador de excepciones globales, como una forma genérica de manejar excepciones.
4. Controlador de excepciones globales
Las instancias de RuntimeException son opcionales de manejar. En consecuencia, todavía deja una ventana abierta para obtener los seguimientos de pila larga en tiempo de ejecución. Para manejar esto, Java proporciona la interfaz UncaughtExceptionHandler . La clase Thread contiene esto como una clase interna.
Además de esta interfaz, la versión de Java 1.5 también introdujo un método estático setDefaultUncaughtExceptionHandler () en la clase Thread . El argumento de este método es una clase de controlador que implementa la interfaz UncaughtExceptionHandler .
Además, esta interfaz declara el método uncaughtException (Thread t, Throwable e) . Se invocará cuando un subproceso t determinado finalice debido a la excepción e no detectada dada . La clase de implementación implementa este método y define la lógica para manejar estas excepciones no detectadas.
Consideremos el siguiente ejemplo que arroja una ArithmeticException en tiempo de ejecución. Definimos la clase Handler que implementa la interfaz UncaughtExceptionHandler .
Esta clase implementa el método uncaughtException () y define la lógica para manejar las excepciones no detectadas en él:
public class GlobalExceptionHandler { public static void main(String[] args) { Handler globalExceptionHandler = new Handler(); Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler); new GlobalExceptionHandler().performArithmeticOperation(10, 0); } public int performArithmeticOperation(int num1, int num2) { return num1/num2; } } class Handler implements Thread.UncaughtExceptionHandler { private static Logger LOGGER = LoggerFactory.getLogger(Handler.class); public void uncaughtException(Thread t, Throwable e) { LOGGER.info("Unhandled exception caught!"); } }
Aquí, el hilo que se está ejecutando actualmente es el hilo principal. Por lo tanto, su instancia se pasa al método uncaughtException () junto con la excepción generada. La clase Handler luego maneja esta excepción.
Lo mismo se aplica a las excepciones marcadas no controladas. Veamos también un ejemplo rápido de esto:
public static void main(String[] args) throws Exception { Handler globalExceptionHandler = new Handler(); Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler); Path file = Paths.get(""); Files.delete(file); }
Aquí, el método Files.delete () arroja una IOException marcada , que además es lanzada por la firma del método main () . El controlador también detectará esta excepción.
De esta manera, UncaughtExceptionHandler ayuda a administrar excepciones no controladas en tiempo de ejecución. Sin embargo, rompe la idea de capturar y manejar la excepción cerca del punto de origen .
5. Conclusión
En este artículo, nos tomamos un tiempo para comprender cuáles son las excepciones y cuáles son las formas básicas de manejarlas. Además, identificamos que el controlador de excepciones global es parte de la clase Thread y maneja las excepciones en tiempo de ejecución no detectadas .
Luego, vimos un programa de muestra que lanza una excepción en tiempo de ejecución y la maneja usando un controlador de excepciones global.
Los códigos de ejemplo para este artículo se pueden encontrar en GitHub.