Avatar billede jespersahner Nybegynder
28. april 2006 - 00:02 Der er 6 kommentarer og
1 løsning

"Global" catch af Exception i Thread

Jeg har et måske lidt diffust spm.: Er der en måde, hvorpå man "globalt" kan catch'e en Exception i en Thread - altså catch af en Exception i en anden tråd.

Konkret er mit problem, at jeg bruger nogle eksterne klasser, som kører i egne Threads, og disse klasser kaster Exceptions, som jeg gerne vil kunne håndtere i min main-Thread.
Avatar billede mikkelbm Nybegynder
28. april 2006 - 00:45 #1
Avatar billede mikkelbm Nybegynder
28. april 2006 - 00:46 #2
Og Thread har en metode:

setDefaultUncaughtExceptionHandler

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)
Avatar billede jespersahner Nybegynder
28. april 2006 - 05:24 #3
->mikkelbm: Det er en ganske fornuftig og simpel løsning.

Jeg har dog flg. problem: Jeg har en applikation, som indeholder flere Threads, herunder JFrames. Hvis applikationen fejler med en Exception, som jeg ikke catch'er, er mit ønske at genstarte applikationen. Med andre ord ønsker jeg at afslutte alle kørende Threads (herunder specielt JFrames) pånær main-Thread. System.exit(0) kan ikke bruges, som jeg ser det, idet den også afslutter main-Thread.

Er der en simpel måde at genstarte en applikation på, hvis en UncaughtException indtræffer?
Avatar billede arne_v Ekspert
28. april 2006 - 05:50 #4
måske noget a la:

package april;

import java.lang.Thread.UncaughtExceptionHandler;
import java.util.concurrent.Semaphore;

import javax.swing.JFrame;

public class ExceptionRestart {
    public static GUI f;
    public static Semaphore sf = new Semaphore(1);
    public static void main(String[] args) {
        Thread.setDefaultUncaughtExceptionHandler(new Handler());
        while(true) {
            try {
                sf.acquire();
            } catch (InterruptedException e) {
            }
            T t = new T();
            f = new GUI();
            t.start();
            f.setVisible(true);
        }
    }
}

class GUI extends JFrame {
    public GUI() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Some GUI");
        setSize(300, 300);
    }
}

class T extends Thread {
    public void run() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
        }
        throw new RuntimeException("Oops");
    }
}

class Handler implements UncaughtExceptionHandler {
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("Restarting ...");
        ExceptionRestart.f.dispose();
        ExceptionRestart.sf.release();
    }
}
Avatar billede jespersahner Nybegynder
28. april 2006 - 14:08 #5
->mikkelbm: Det er præcis, hvad jeg har brug for her. Tak for hjælpen og tak til Arne for input.
Avatar billede arne_v Ekspert
29. april 2006 - 21:47 #6
og førend jeg bliver flået p.g.a. de public static fields:

package april;

import java.lang.Thread.UncaughtExceptionHandler;
import java.util.concurrent.Semaphore;

import javax.swing.JFrame;

public class RestartableApp {
    private T t;
    private GUI f;
    private Semaphore sf = new Semaphore(1);
    public void initRestart() {
        f.dispose();
        sf.release();
    }
    public void exec() {
        Thread.setDefaultUncaughtExceptionHandler(new Handler(this));
        while(true) {
            try {
                sf.acquire();
            } catch (InterruptedException e) {
            }
            t = new T();
            f = new GUI();
            t.start();
            f.setVisible(true);
        }
    }
    public static void main(String[] args) {
        RestartableApp er = new RestartableApp();
        er.exec();
    }
}

class GUI extends JFrame {
    public GUI() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Some GUI");
        setSize(300, 300);
    }
}

class T extends Thread {
    public void run() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
        }
        throw new RuntimeException("Oops");
    }
}

class Handler implements UncaughtExceptionHandler {
    private RestartableApp app;
    public Handler(RestartableApp app) {
        this.app = app;
    }
    public void uncaughtException(Thread t, Throwable e) {
        app.initRestart();
        System.out.println("Restarting ...");
    }
}
Avatar billede jespersahner Nybegynder
30. april 2006 - 11:48 #7
->arne_v: Fint illustrativt eksempel. Jeg fortsætter under http://www.eksperten.dk/spm/706157.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester