Java Global Exception Handler

Java Global Exception Handler

1. Überblick

In diesem Tutorial konzentrieren wir uns auf den Global Exception Handler in Java. Wir werden zunächst die Grundlagen der Ausnahmen und die Ausnahmebehandlung erörtern. Dann werfen wir einen umfassenden Blick auf den globalen Ausnahmebehandler.

Um mehr über die Ausnahmen im Allgemeinen zu erfahren, schauen Sie sichException Handling in Java an.

2. Was ist eine Ausnahme?

An exception is an abnormal condition that arises in a code sequence at runtime or at compile time. Dieser abnormale Zustand tritt auf, wenn ein Programm die semantischen Einschränkungen der Programmiersprache Java verletzt.

Exceptions that occur during the compile time are checked exceptions. Diese Ausnahmen sind direkte Unterklassen der KlasseException, und es ist erforderlich, diese Ausnahmen im Code zu behandeln.

Another type of exceptions are the unchecked exceptions. The compiler does not check for these exceptions during the compile time. Diese Ausnahmen sind direkte Unterklassen der KlasseRuntimeException, die die KlasseExceptionerweitern.

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

3. Ausnahmebehandlungsroutinen

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

Whenever an exception occurs, an Exception object is constructed, entweder von der JVM oder von der Methode, die den Code ausführt. Dieses Objekt enthält die Informationen zur Ausnahme. Exception handling is a way of handling this Exception object.

3.1. Dertry-catch Block

Im folgenden Beispiel enthält der Blocktry den Code, der eine Ausnahme auslösen kann. Der Blockcatch enthält die Logik zur Behandlung dieser Ausnahme.

Der Blockcatchfängt das ObjektExceptionab, das der Code im Blocktryauslö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. Die Schlüsselwörterthrow undthrows

Alternativ kann die Methode auch die Ausnahme auslösen, anstatt sie zu behandeln. Das bedeutet, dass die Logik zur Behandlung desException-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 derRuntimeException können optional behandelt werden. Folglich bleibt immer noch ein Fenster offen, in dem die langen Stack-Traces zur Laufzeit abgerufen werden können. Um dies zu handhaben,Java provides the UncaughtExceptionHandler interface. DieThread-Klasse enthält dies als innere Klasse.

Zusätzlich zu dieser Schnittstelle werdenJava 1.5 release also introduced a static method setDefaultUncaughtExceptionHandler() in the Thread class. Das Argument dieser Methode ist eine Handlerklasse, die dieUncaughtExceptionHandler-Schnittstelle implementiert.

Darüber hinaus deklariert diese Schnittstelle die MethodeuncaughtException(Thread t, Throwable e). Es wird aufgerufen, wenn ein bestimmter Threadt aufgrund der angegebenen nicht erfassten Ausnahmee 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 einArithmeticException auslöst. Wir definieren die KlasseHandler, die die SchnittstelleUncaughtExceptionHandler implementiert.

Diese Klasse implementiert die MethodeuncaughtException() 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 Haupt-Thread. Daher wird seine Instanz zusammen mit der ausgelösten Ausnahme an die MethodeuncaughtException() übergeben. Die KlasseHandler behandelt dann diese Ausnahme.

Gleiches gilt für nicht bearbeitete 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 MethodeFiles.delete() ein geprüftesIOException, aus, das durch die Methodensignaturmain()weiter ausgelöst wird. DieHandler werden diese Ausnahme ebenfalls abfangen.

Auf diese Weise hilftUncaughtExceptionHandler bei der Verwaltung nicht behandelter Ausnahmen zur Laufzeit. Es ist jedochbreaks the idea of catching and handling the exception close to the point of origin.

5. Fazit

In diesem Artikel haben wir uns die Zeit genommen, um die Ausnahmen und die grundlegenden Vorgehensweisen zu verstehen. Außerdem haben wir festgestellt, dass der globale Ausnahmebehandler Teil der KlasseThreadist 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 inover on GitHub.