Gestore di eccezioni globale Java

1. Panoramica

In questo tutorial, ci concentreremo sul gestore di eccezioni globale in Java. Discuteremo prima le basi delle eccezioni e la gestione delle eccezioni. Quindi avremo uno sguardo completo sul gestore di eccezioni globale.

Per saperne di più sulle eccezioni in generale, dai un'occhiata a Gestione delle eccezioni in Java.

2. Che cos'è un'eccezione?

Un'eccezione è una condizione anomala che si verifica in una sequenza di codice in fase di esecuzione o in fase di compilazione. Questa condizione anomala si verifica quando un programma viola i vincoli semantici del linguaggio di programmazione Java.

Le eccezioni che si verificano durante la fase di compilazione sono eccezioni controllate . Queste eccezioni sono sottoclassi dirette della classe Exception ed è necessario gestire queste eccezioni nel codice.

Un altro tipo di eccezioni sono le eccezioni non controllate . Il compilatore non verifica queste eccezioni durante la fase di compilazione. Queste eccezioni sono sottoclassi dirette della classe RuntimeException che estende la classe Exception .

Inoltre, non è necessario gestire le eccezioni di runtime nel codice.

3. Gestori di eccezioni

Java è un robusto linguaggio di programmazione. Una delle caratteristiche principali che lo rende robusto è il framework di gestione delle eccezioni. Significa che il programma può uscire con grazia nei momenti di errore, invece di bloccarsi.

Ogni volta che si verifica un'eccezione, un E xception oggetto viene costruito , sia da JVM o dal metodo di esecuzione del codice. Questo oggetto contiene le informazioni sull'eccezione. La gestione delle eccezioni è un modo per gestire questo oggetto Eccezione .

3.1. Il blocco try-catch

Nell'esempio seguente, il blocco try contiene il codice che può generare un'eccezione. Il blocco catch contiene la logica per gestire questa eccezione.

Il blocco catch cattura l' oggetto Exception che il codice nel blocco try solleva:

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. Il lancio e il lancio di parole chiave

In alternativa, il metodo può anche scegliere di lanciare l'eccezione invece di gestirla. Ciò significa che la logica per gestire l' oggetto Exception è scritta da qualche altra parte.

Di solito, il metodo chiamante gestisce l'eccezione in questi casi:

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; } } }

Successivamente, considereremo il gestore delle eccezioni globale, come un modo generico per gestire le eccezioni.

4. Gestore di eccezioni globale

Le istanze di RuntimeException sono facoltative da gestire. Di conseguenza, lascia ancora aperta una finestra per ottenere le tracce dello stack lungo in fase di esecuzione. Per gestire ciò, Java fornisce l' interfaccia UncaughtExceptionHandler . La classe Thread lo contiene come classe interna.

Oltre a questa interfaccia, la versione Java 1.5 ha anche introdotto un metodo statico setDefaultUncaughtExceptionHandler () nella classe Thread . L'argomento di questo metodo è una classe gestore che implementa l' interfaccia UncaughtExceptionHandler .

Inoltre, questa interfaccia dichiara il metodo uncaughtException (Thread t, Throwable e) . Verrà invocato quando un dato thread t termina a causa della data eccezione non rilevata e . La classe di implementazione implementa questo metodo e definisce la logica per la gestione di queste eccezioni non rilevate.

Consideriamo il seguente esempio che genera un'eccezione ArithmeticException in fase di esecuzione. Definiamo la classe Handler che implementa l'interfaccia UncaughtExceptionHandler .

Questa classe implementa il metodo uncaughtException () e definisce la logica per gestire le eccezioni non rilevate in esso:

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!"); } }

Qui, il thread attualmente in esecuzione è il thread principale. Pertanto, la sua istanza viene passata al metodo uncaughtException () insieme all'eccezione sollevata. Il gestore della classe gestisce quindi questa eccezione.

Lo stesso vale per le eccezioni controllate non gestite. Vediamo anche un rapido esempio di questo:

public static void main(String[] args) throws Exception { Handler globalExceptionHandler = new Handler(); Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler); Path file = Paths.get(""); Files.delete(file); }

Qui, il metodo Files.delete () genera un'IOException controllata , che viene ulteriormente lanciata dalla firma del metodo main () . Il conduttore rileverà anche questa eccezione.

In questo modo, UncaughtExceptionHandler aiuta a gestire le eccezioni non gestite in fase di esecuzione. Tuttavia, rompe l'idea di catturare e gestire l'eccezione vicino al punto di origine .

5. conclusione

In questo articolo, ci siamo presi del tempo per capire quali sono le eccezioni e quali sono i modi di base per gestirle. Inoltre, abbiamo identificato che il gestore di eccezioni globale fa parte della classe Thread e gestisce le eccezioni di runtime non rilevate.

Quindi, abbiamo visto un programma di esempio che genera un'eccezione di runtime e la gestisce utilizzando un gestore di eccezioni globale.

I codici di esempio per questo articolo possono essere trovati su GitHub.