Gestion des exceptions levées à partir des threads
Dans les applications multithread, il est essentiel de gérer les exceptions levées par les threads enfants dans le thread principal. Considérons le scénario suivant :
<br>public class Test extends Thread {<br> public static void main(String[] args) throws InterruptedException {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">Test t = new Test(); try { t.start(); t.join(); } catch (RuntimeException e) { System.out.println("** RuntimeException from main"); } System.out.println("Main stoped");
}
@Override
public void run() {
try { while (true) { System.out.println("** Started"); sleep(2000); throw new RuntimeException("exception from thread"); } } catch (RuntimeException e) { System.out.println("** RuntimeException from thread"); throw e; } catch (InterruptedException e) { }
}
}
Dans cet exemple, une exception levée dans le thread enfant ne se propage pas au thread principal. En effet, Java n'associe pas automatiquement les exceptions lancées dans les threads aux gestionnaires du thread principal.
Solution : Thread.UncaughtExceptionHandler
Pour gérer les exceptions des threads, un peut utiliser un Thread.UncaughtExceptionHandler. Cette interface fournit une méthode uncaughtException() qui est appelée lorsqu'une exception non interceptée se produit dans un thread.
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() { System.out.println("Sleeping ..."); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Interrupted."); } System.out.println("Throwing exception ..."); throw new RuntimeException(); } }; t.setUncaughtExceptionHandler(h); t.start();
En définissant uncaughtExceptionHandler sur le thread, toutes les exceptions non interceptées seront gérées par l'implémentation fournie. Cela permet au thread principal de capturer et de traiter les exceptions avec élégance, garantissant ainsi une gestion et un rapport d'erreurs appropriés.
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!