Java Global Exception Handler

1. Übersicht

In diesem Tutorial konzentrieren wir uns auf den Global Exception Handler in Java. Wir werden zuerst die Grundlagen der Ausnahmen und die Ausnahmebehandlung diskutieren. Dann werfen wir einen umfassenden Blick auf den globalen Ausnahmebehandler.

Weitere Informationen zu den Ausnahmen im Allgemeinen finden Sie unter Ausnahmebehandlung in Java.

2. Was ist eine Ausnahme?

Eine Ausnahme ist ein abnormaler Zustand, der in einer Codesequenz zur Laufzeit oder zur Kompilierungszeit auftritt. Dieser abnormale Zustand tritt auf, wenn ein Programm die semantischen Einschränkungen der Java-Programmiersprache verletzt.

Ausnahmen, die während der Kompilierungszeit auftreten, sind geprüfte Ausnahmen . Diese Ausnahmen sind direkte Unterklassen der Exception- Klasse, und diese Ausnahmen müssen im Code behandelt werden.

Eine andere Art von Ausnahmen sind die nicht aktivierten Ausnahmen . Der Compiler sucht während der Kompilierungszeit nicht nach diesen Ausnahmen. Diese Ausnahmen sind direkte Unterklassen der RuntimeException- Klasse, die die Exception- Klasse erweitert.

Es ist auch nicht erforderlich, Laufzeitausnahmen im Code zu behandeln.

3. Ausnahmebehandlungsroutinen

Java ist eine robuste Programmiersprache. Eine der Hauptfunktionen, die es robust macht, ist das Framework für die Ausnahmebehandlung. Dies bedeutet, dass das Programm zum Zeitpunkt des Fehlers ordnungsgemäß beendet werden kann, anstatt nur abzustürzen.

Immer dann , wenn eine Ausnahme auftritt, wird ein E xception wird Objekt konstruiert , entweder durch die JVM oder durch das Verfahren , den Code auszuführen. Dieses Objekt enthält die Informationen zur Ausnahme. Die Ausnahmebehandlung ist eine Möglichkeit, dieses Ausnahmeobjekt zu behandeln .

3.1. Der Try-Catch- Block

Im folgenden Beispiel enthält der try- Block den Code, der eine Ausnahme auslösen kann. Der catch- Block enthält die Logik zur Behandlung dieser Ausnahme.

Der catch- Block fängt das Exception- Objekt ab, das der Code im try- Block auslöst:

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. Der Wurf und wirft Schlüsselwörter

Alternativ kann die Methode auch die Ausnahme auslösen, anstatt sie zu behandeln. Das bedeutet, dass die Logik zur Behandlung des Exception- Objekts an einer anderen Stelle geschrieben ist.

Normalerweise behandelt die aufrufende Methode die Ausnahme in folgenden Fällen:

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

Als Nächstes betrachten wir den Global Exception Handler als generische Methode zur Behandlung von Ausnahmen.

4. Global Exception Handler

Die Instanzen der RuntimeException können optional behandelt werden. Folglich bleibt immer noch ein Fenster offen, um die langen Stapelspuren zur Laufzeit abzurufen. Um dies zu handhaben, stellt Java die UncaughtExceptionHandler- Schnittstelle bereit . Die Thread- Klasse enthält dies als innere Klasse.

Zusätzlich zu dieser Schnittstelle wurde in Java 1.5 eine statische Methode setDefaultUncaughtExceptionHandler () in der Thread- Klasse eingeführt . Das Argument dieser Methode ist eine Handlerklasse, die die UncaughtExceptionHandler- Schnittstelle implementiert .

Darüber hinaus deklariert diese Schnittstelle die Methode uncaughtException (Thread t, Throwable e) . Es wird aufgerufen, wenn ein gegebener Thread t aufgrund der gegebenen nicht erfassten Ausnahme e beendet wird . Die implementierende Klasse implementiert diese Methode und definiert die Logik für die Behandlung dieser nicht erfassten Ausnahmen.

Betrachten wir das folgende Beispiel, das zur Laufzeit eine ArithmeticException auslöst. Wir definieren die Klasse Handler , dass Geräte die Schnittstelle UncaughtExceptionHandler .

Diese Klasse implementiert die Methode uncaughtException () und definiert die Logik, um nicht erfasste Ausnahmen darin zu behandeln:

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

Hier ist der aktuell ausgeführte Thread der Hauptthread. Daher wird seine Instanz zusammen mit der ausgelösten Ausnahme an die Methode uncaughtException () übergeben . Die Klasse Handler behandelt dann diese Ausnahme.

Gleiches gilt für nicht behandelte geprüfte Ausnahmen. Sehen wir uns auch ein kurzes Beispiel dafür an:

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

Hier löst die Files.delete () -Methode eine überprüfte IOException aus, die durch die signatur der main () -Methode weiter ausgelöst wird . Der Handler wird diese Ausnahme ebenfalls abfangen.

Auf diese Weise hilft der UncaughtExceptionHandler bei der Verwaltung nicht behandelter Ausnahmen zur Laufzeit. Es bricht jedoch die Idee, die Ausnahme in der Nähe des Ursprungspunkts zu fangen und zu behandeln .

5. Schlussfolgerung

In diesem Artikel haben wir uns Zeit genommen, um zu verstehen, was die Ausnahmen sind und wie sie grundlegend behandelt werden. Außerdem haben wir festgestellt, dass der globale Ausnahmehandler Teil der Thread- Klasse ist und die nicht erfassten Laufzeitausnahmen behandelt.

Dann haben wir ein Beispielprogramm gesehen, das eine Laufzeitausnahme auslöst und diese mit einem globalen Ausnahmehandler behandelt.

Die Beispielcodes für diesen Artikel finden Sie auf GitHub.