Java Global Exception Handler

1. Oversigt

I denne vejledning fokuserer vi på Global Exception Handler i Java. Vi diskuterer først det grundlæggende i undtagelserne og håndteringen af ​​undtagelser. Så får vi et omfattende kig på den globale undtagelsesbehandler.

For at lære mere om undtagelserne generelt skal du se på Undtagelseshåndtering i Java.

2. Hvad er en undtagelse?

En undtagelse er en unormal tilstand, der opstår i en kodesekvens ved runtime eller på kompileringstidspunktet. Denne unormale tilstand opstår, når et program overtræder Java-programmeringssprogets semantiske begrænsninger.

Undtagelser, der opstår i løbet af kompileringstiden, er kontrollerede undtagelser. Disse undtagelser er direkte underklasser af Undtagelse klasse, og det er nødvendigt at håndtere disse undtagelser i koden.

En anden type undtagelser er ukontrollerede undtagelser. Compileren kontrollerer ikke for disse undtagelser i løbet af kompileringstiden. Disse undtagelser er direkte underklasser af RuntimeException klasse, der udvider Undtagelse klasse.

Det er heller ikke nødvendigt at håndtere undtagelser for kørsel i koden.

3. Undtagelsesbehandlere

Java er et robust programmeringssprog. En af de kerneegenskaber, der gør den robust, er undtagelseshåndteringsrammen. Det betyder, at programmet kan gå elegant ud på fejltiderne i stedet for bare at gå ned.

Hver gang der forekommer en undtagelse, an Exception objekt er konstrueret, enten ved hjælp af JVM eller ved metoden, der udfører koden. Dette objekt indeholder oplysninger om undtagelsen. Undtagelseshåndtering er en måde at håndtere dette på Undtagelse objekt.

3.1. Det prøve-fangst Blok

I det følgende eksempel er prøve blok indeholder den kode, der kan kaste en undtagelse. Det fangst blok indeholder logikken til at håndtere denne undtagelse.

Det fangst blok fanger den Undtagelse gør indsigelse mod, at koden i prøve blok rejser:

Strengstreng = "01, 2010"; DateFormat format = nyt SimpleDateFormat ("MM, dd, åååå"); Dato dato; prøv {date = format.parse (streng); } fange (ParseException e) {System.out.println ("ParseException fanget!"); }

3.2. Det kaste og kaster Nøgleord

Alternativt kan metoden også vælge at kaste undtagelsen i stedet for at håndtere den. Det betyder logikken til at håndtere Undtagelse objekt er skrevet et andet sted.

Normalt håndterer opkaldsmetoden undtagelsen i sådanne tilfælde:

offentlig klasse ExceptionHandler {public static void main (String [] args) {String strDate = "01,, 2010"; String dateFormat = "MM, dd, åååå"; prøv {Date date = new DateParser (). getParsedDate (strDate, dateFormat); } catch (ParseException e) {System.out.println ("Opkaldsmetoden fanget ParseException!"); }}} klasse DateParser {offentlig dato getParsedDate (String strDate, String dateFormat) kaster ParseException {DateFormat format = ny SimpleDateFormat (dateFormat); prøv {return format.parse (strDate); } fange (ParseException parseException) {throw parseException; }}}

Dernæst overvejer vi Global Exception Handler som en generisk måde at håndtere undtagelser på.

4. Global undtagelsesbehandler

Forekomsterne af RuntimeException er valgfri at håndtere. Derfor efterlader det stadig et vindue åbent for at få de lange stakspor ved kørsel. For at håndtere dette, Java leverer UncaughtExceptionHandler interface. Det Tråd klasse indeholder dette som en indre klasse.

Ud over denne grænseflade, Java 1.5-frigivelse introducerede også en statisk metode setDefaultUncaughtExceptionHandler () i Tråd klasse. Argumentet for denne metode er en handlerklasse, der implementerer UncaughtExceptionHandler interface.

Desuden erklærer denne grænseflade metoden uncaughtException (Thread t, Throwable e). Det påberåbes, når en given tråd t ophører på grund af den givne ikke fangede undtagelse e. Implementeringsklassen implementerer denne metode og definerer logikken til håndtering af disse ikke fangede undtagelser.

Lad os overveje følgende eksempel, der kaster et Aritmetisk undtagelse ved kørselstid. Vi definerer klassen Handler der implementerer grænsefladen UncaughtExceptionHandler.

Denne klasse implementerer metoden uncaughtException () og definerer logik til at håndtere ufangede undtagelser i den:

offentlig klasse GlobalExceptionHandler {public static void main (String [] args) {Handler globalExceptionHandler = new Handler (); Thread.setDefaultUncaughtExceptionHandler (globalExceptionHandler); ny GlobalExceptionHandler (). performArithmeticOperation (10, 0); } public int performArithmeticOperation (int num1, int num2) {return num1 / num2; }} klassehåndterer implementerer Thread.UncaughtExceptionHandler {privat statisk logger LOGGER = LoggerFactory.getLogger (Handler.class); offentlig ugyldig uncaughtException (Thread t, Throwable e) {LOGGER.info ("Unhandled undtagelse fanget!"); }}

Her er den aktuelt udførende tråd hovedtråden. Således sendes dets forekomst til metoden uncaughtException () sammen med den hævede undtagelse. Klassen Handler håndterer derefter denne undtagelse.

Det samme gælder undtagelser, der ikke er håndteret. Lad os også se et hurtigt eksempel på dette:

offentlig statisk ugyldigt hoved (String [] args) kaster Undtagelse {Handler globalExceptionHandler = ny Handler (); Thread.setDefaultUncaughtExceptionHandler (globalExceptionHandler); Sti-fil = Paths.get (""); Files.delete (fil); }

Her, den Files.delete () metode kaster en markeret IO-undtagelse, som yderligere kastes af hoved () metodesignatur. Det Handler vil også fange denne undtagelse.

På denne måde UncaughtExceptionHandler hjælper med at styre uhåndterede undtagelser ved kørsel. Dog det bryder ideen om at fange og håndtere undtagelsen tæt på oprindelsesstedet.

5. Konklusion

I denne artikel tog vi os tid til at forstå, hvad undtagelserne er, og hvad er de grundlæggende måder at håndtere dem på. Vi identificerede også, at den globale undtagelsesbehandler er en del af Tråd klasse, og den håndterer de ikke fangede undtagelser fra runtime.

Derefter så vi et prøveprogram, der kaster en runtime-undtagelse og håndterer det ved hjælp af en global undtagelseshandler.

Eksempelkoderne til denne artikel kan findes på GitHub.