Java Global Exception Handler

Gestionnaire d'exception globale Java

1. Vue d'ensemble

Dans ce didacticiel, nous allons nous concentrer sur le Global Exception Handler en Java. Nous aborderons d'abord les bases des exceptions et la gestion des exceptions. Ensuite, nous examinerons le gestionnaire d'exceptions global.

Pour en savoir plus sur les exceptions en général, jetez un œil àException Handling in Java.

2. Qu'est-ce qu'une exception?

An exception is an abnormal condition that arises in a code sequence at runtime or at compile time. Cette condition anormale survient lorsqu'un programme viole les contraintes sémantiques du langage de programmation Java.

Exceptions that occur during the compile time are checked exceptions. Ces exceptions sont des sous-classes directes de la classeException, et il est nécessaire de gérer ces exceptions dans le code.

Another type of exceptions are the unchecked exceptions. The compiler does not check for these exceptions during the compile time. Ces exceptions sont des sous-classes directes de la classeRuntimeException qui étend la classeException.

De plus, il n’est pas nécessaire de gérer les exceptions d’exécution dans le code.

3. Gestionnaires d'exceptions

Java est un langage de programmation robuste. L'une des principales caractéristiques qui le rend robuste est le cadre de traitement des exceptions. Cela signifie que le programme peut quitter en douceur au moment de l'erreur, au lieu de simplement planter.

Whenever an exception occurs, an Exception object is constructed, soit par la JVM, soit par la méthode exécutant le code. Cet objet contient les informations sur l'exception. Exception handling is a way of handling this Exception object.

3.1. Le bloctry-catch

Dans l'exemple suivant, le bloctry contient le code qui peut lever une exception. Le bloccatch contient la logique pour gérer cette exception.

Le bloccatch attrape l'objetException que le code du bloctry déclenche:

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. Les mots-clésthrow etthrows

Sinon, la méthode peut également choisir de lever l'exception au lieu de la gérer. Cela signifie que la logique pour gérer l'objetException est écrite ailleurs.

Habituellement, la méthode appelante gère l'exception dans ces cas:

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

}

Ensuite, nous allons considérer le Global Exception Handler, comme un moyen générique de gérer les exceptions.

4. Gestionnaire d'exceptions globales

Les instances desRuntimeException sont facultatives à gérer. Par conséquent, il laisse toujours une fenêtre ouverte pour obtenir les traces de la pile longue au moment de l'exécution. Pour gérer cela,Java provides the UncaughtExceptionHandler interface. La classeThread contient ceci comme classe interne.

En plus de cette interface,Java 1.5 release also introduced a static method setDefaultUncaughtExceptionHandler() in the Thread class. L'argument de cette méthode est une classe de gestionnaire qui implémente l'interfaceUncaughtExceptionHandler.

De plus, cette interface déclare la méthodeuncaughtException(Thread t, Throwable e). Il sera appelé quand un thread donnét se termine en raison de l'exception non interceptéee donnée. La classe d'implémentation implémente cette méthode et définit la logique de traitement de ces exceptions non interceptées.

Prenons l'exemple suivant qui lance unArithmeticException au moment de l'exécution. Nous définissons la classeHandler qui implémente l'interfaceUncaughtExceptionHandler.

Cette classe implémente la méthodeuncaughtException() et définit la logique pour gérer les exceptions non interceptées:

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

Ici, le fil en cours d'exécution est le fil principal. Ainsi, son instance est passée à la méthodeuncaughtException() avec l'exception levée. La classeHandler gère alors cette exception.

La même chose s'applique aux exceptions vérifiées non gérées. Voyons également un exemple rapide de ceci:

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

Ici, la méthodeFiles.delete() renvoie unIOException, vérifié qui est ensuite renvoyé par la signature de la méthodemain(). LesHandler intercepteront également cette exception.

De cette façon, leUncaughtExceptionHandler aide à gérer les exceptions non gérées à l'exécution. Cependant, ilbreaks the idea of catching and handling the exception close to the point of origin.

5. Conclusion

Dans cet article, nous avons pris le temps de comprendre quelles sont les exceptions et quels sont les moyens de base pour les gérer. De plus, nous avons identifié que le gestionnaire d'exceptions global fait partie de la classeThread et qu'il gère les exceptions d'exécution non interceptées.

Ensuite, nous avons vu un exemple de programme qui lève une exception d'exécution et la gère à l'aide d'un gestionnaire d'exceptions global.

Les exemples de codes pour cet article peuvent être trouvésover on GitHub.