web-dev-qa-db-fra.com

Java: gestionnaire d'exceptions globales

Existe-t-il un moyen de créer un gestionnaire d'exceptions global en Java. Je veux utiliser comme ceci:

"When an exception is thrown somewhere in the WHOLE program, exit."

Le gestionnaire ne peut pas intercepter les exceptions levées dans un try-catch corps.

Martijn

40
Martijn Courteaux

Utilisez Thread.setDefaultUncaughtExceptionHandler . Voir le billet de blog " Global Exception Handling " de Rod Hilton pour un exemple.

58
bobbymcr

Vous pouvez définir le UncaughtExceptionHandler par défaut , qui sera utilisé chaque fois qu'une exception se propage non interceptée dans le système.

4
Kolibri

Voici un exemple qui utilise Logback pour gérer toutes les exceptions non interceptées:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    public void uncaughtException(Thread t, Throwable e) {
        LoggerFactory.getLogger("CustomLogger").error("Uncaught Exception in thread '" + t.getName() + "'", e);
        System.exit(1);
    }
});

Cela peut également être fait sur une base par thread en utilisant Thread.setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)

3
Brad Mace

Pour plus de précisions, utilisez setDefaultUncaughtExceptionHandler pour les applications autonomes Java ou pour les cas où vous êtes sûr d'avoir un point d'entrée bien défini pour le thread.

Pour les cas où vous n'avez pas de point d'entrée bien défini pour le thread, par exemple, lorsque vous exécutez dans un contexte de serveur Web ou de serveur d'applications ou dans un autre framework où la configuration et le démontage sont gérés en dehors de votre code, regardez pour voir comment ce cadre gère les exceptions globales. En règle générale, ces cadres ont leurs propres gestionnaires d'exceptions globaux établis auxquels vous devenez participant plutôt que de définir.

Pour une discussion plus élaborée, veuillez consulter http://metatations.com/2011/11/20/global-exception-handling-in-Java/

2
Clifford Oravec

DefaultUncaughtExceptionHandler est la bonne réponse. Il m'a été révélé par Jeff Storey à cet emplacement, il y a quelques jours. Comme vous le soupçonniez, les exceptions interceptées "manuellement" ne seront jamais interceptées par ce gestionnaire. Cependant, j'ai reçu l'avertissement suivant:

** - Pour être conforme à J2EE, une webapp ne doit utiliser aucun thread. **

quand j'ai vérifié mon projet par rapport aux bonnes pratiques et recommandé Java style de codage avec PMD plug-in pour Eclipse IDE.

0
hypercube

Threads.setDefaultUncaughtExceptionHandler () fonctionne mais pas dans tous les cas. Par exemple, je l'utilise dans mon main () avant de créer des widgets Swing, et cela fonctionne dans les threads créés par Swing, tels que le thread d'événement AWT ou les threads SwingWorker.

Malheureusement, cela n'a aucun effet sur le thread créé par javax.naming.spi.NamingManager.getInitialContext () lors de l'utilisation d'une URL LDAP, à l'aide de JavaSE 1.6. Il y a sans doute d'autres exceptions.

0
Jeff Learman