„Bună, Amigo!

„Vreau să vă spun despre ceva mic, dar interesant”.

"Ascult. Îmi plac lucrurile care sunt mici și interesante."

„Ei bine, știți că fiecare obiect Thread are o metodă run() și că o puteți executa pe un fir separat folosind metoda start()”.

"Da, desigur."

"Dar acum imaginați-vă această situație: începeți un thread pentru a efectua ceva de lucru, dar se aruncă o excepție și firul se oprește pentru că nu știe ce să facă. Nu ar trebui să știți cumva despre această eroare?"

"Sunt de acord. Ar trebui să prind cumva excepția care a apărut pe celălalt thread care rulează. Java măcar suportă asta?"

— Mă insulti. Desigur că da.

„Creatorii lui Java au inventat o interfață specială numită UncaughtExceptionHandler. Iată cum să prindeți și să gestionați o excepție care apare pe un alt fir, dacă acel thread nu o prinde:”

Exemplu
public class DownloadManager
{
 public static void main(String[] args)
 {
   Thread thread = new DownloadThread();
   thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
   {
    @Override
    public void uncaughtException(Thread t, Throwable e)
    {

    }
 });

 thread.start();
}

„Obiectul Thread are o metodă specială setUncaughtExceptionHandler . Trebuie să îi transmiteți un obiect care implementează interfața Thread.UncaughtExceptionHandler . Această interfață are o singură metodă: uncaughtException(Thread t, Throwable e) . Aceasta este metoda care va fi apelată pe obiectul transmis dacă apare o excepție neprinsă în metoda run."

„În exemplul meu de mai sus, declar pur și simplu o clasă interioară anonimă (evidențiată cu roșu) care implementează Thread. Interfața Thread.UncaughtExceptionHandler . Și îi anulez metoda uncaughtException(Thread t, Throwable e) ”.

„După cum puteți vedea din lista de parametri ai metodei, vor fi transmise două argumente: o referință la obiectul Thread unde a apărut excepția și excepția în sine, transmisă ca Throwable e.”

„Ei bine, de ce am nevoie de variabila Thread t? Nu știm deja în ce Thread punem un obiect Thread.UncaughtExceptionHandler ?”

„Au făcut acest lucru pentru a putea scrie un handler universal pentru aceste situații. Adică puteți crea un singur obiect și îl puteți transmite la zeci de fire diferite. Apoi metoda uncaughtException( Thread t, Throwable e) vă oferă întotdeauna o referință la Obiect Thread unde a apărut excepția."

"Mai mult, poți crea zeci de fire, de exemplu, într-o buclă pentru a efectua sarcini specifice. În general, această referire la obiectul Thread nu va fi de prisos. Îți promit asta."

— Te cred. Nu ai greşit niciodată.