Maison >Java >javaDidacticiel >Comment puis-je détecter les exceptions levées par les threads en Java ?

Comment puis-je détecter les exceptions levées par les threads en Java ?

DDD
DDDoriginal
2024-12-04 00:26:10876parcourir

How Can I Catch Exceptions Thrown by Threads in Java?

Détecter les exceptions des threads en Java

Dans les applications multithread, la gestion des exceptions lancées dans différents threads peut être un défi. Considérons un scénario dans lequel une classe principale initie un nouveau thread et tente d'intercepter toutes les exceptions d'exécution générées par celui-ci.

// Original Code
public class CatchThreadException {

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread() {
            @Override
            public void run() {
                throw new RuntimeException("Exception from thread");
            }
        };

        try {
            t.start();
            t.join();
        } catch (RuntimeException e) {
            System.out.println("** RuntimeException from main");
        }

        System.out.println("Main stopped");
    }
}

Dans ce code, le thread principal attend que le thread enfant se termine à l'aide de join(). méthode. Cependant, lorsque le thread enfant lève une exception, le thread principal ne l'attrape pas.

Gestionnaire d'exceptions non capturées pour les threads

Pour résoudre ce problème, Java fournit un thread .Interface UncaughtExceptionHandler. En implémentant cette interface et en l'attribuant à un thread, vous pouvez gérer les exceptions non interceptées lancées dans ce thread.

// Using Uncaught Exception Handler
public class CatchThreadException {

    public static void main(String[] args) throws InterruptedException {
        Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread th, Throwable ex) {
                System.out.println("Uncaught exception: " + ex);
            }
        };
        Thread t = new Thread() {
            @Override
            public void run() {
                throw new RuntimeException("Exception from thread");
            }
        };
        t.setUncaughtExceptionHandler(h);
        t.start();
        t.join();
        System.out.println("Main stopped");
    }
}

Dans ce code modifié :

  1. Nous créons une nouvelle instance de un UncaughtExceptionHandler.
  2. Nous attribuons UncaughtExceptionHandler au thread enfant à l'aide de setUncaughtExceptionHandler() méthode.
  3. Lorsqu'une exception non interceptée se produit dans le thread enfant, la méthode uncaughtException() de notre gestionnaire est invoquée, nous permettant de gérer l'exception avec élégance.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn