2009-10-10 16 views
36

Esiste un modo per creare un gestore di eccezioni globale in Java. Voglio usare in questo modo:Java: Global Exception Handler

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

Il conduttore non può intercettare le eccezioni gettati in un corpo try-catch.

Martijn

risposta

0

DefaultUncaughtExceptionHandler è la risposta corretta. Mi è stato rivelato dal Jeff Storey al this posizione, pochi giorni fa. Come sospetti, le eccezioni rilevate "manualmente" non verranno mai catturate da questo gestore. Tuttavia ho ottenuto il seguente avviso:.

** - Per essere conforme a J2EE, una webapp non deve usare alcun filo **

quando ho controllato il mio progetto contro buone pratiche e ha raccomandato java stile di codifica con PMD plug-in per IDIDE.

+0

"** - Per essere conforme a J2EE, una webapp non deve utilizzare alcun thread. **" - Non ne sono a conoscenza. Intendi dire che il metodo service() (e doGet(), doPost(), ecc.) In un servlet non dovrebbe generare nuovi thread? – Kolibri

+0

Non ho idea di cosa significhi, in quanto la mia app non è basata sul web. L'ho google per un po ', e non ho trovato nessuna risposta, ho paura. Oltre agli avvertimenti come questo o "nome variabile è troppo breve" o "nome variabile è troppo lungo", ho fondato PMD per essere una grande fonte di ispirazione. Lo consiglio vivamente. – hypercube

+1

Ho fatto un po 'di ricerche e, apparentemente, non è possibile creare thread direttamente in J2EE. Ho trovato un paio di link: http://www.theserverside.com/discussions/thread.tss?thread_id=44353 e http://stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee -container-is-scorouraged – Kolibri

1

Per chiarimenti, utilizzare setDefaultUncaughtExceptionHandler per le applicazioni Java standalone o per le istanze in cui si è certi di disporre di un punto di ingresso ben definito per il Thread.

Per le istanze in cui non si dispone di un punto di ingresso ben definito per il Thread, ad esempio, quando si esegue un server Web o un contesto di app server o altro framework in cui l'installazione e il teardown sono gestiti al di fuori del codice , guarda per vedere come quella struttura gestisce le eccezioni globali. In genere, questi framework hanno i propri gestori di eccezioni globali consolidati a cui si partecipa, anziché definire.

Per una discussione più elaborata, si prega di consultare http://metatations.com/2011/11/20/global-exception-handling-in-java/

2

Ecco un esempio che utilizza Logback per gestire le eventuali eccezioni non gestite fanno:

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); 
    } 
}); 

Questo può anche essere fatto su una base thread utilizzando Thread.setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)

0

Threads.setDefaultUncaughtExceptionHandler() funziona ma non in tutti i casi. Ad esempio, lo sto usando nel mio main() prima di creare i widget Swing, e funziona nei thread creati da Swing, come il thread di eventi AWT oi thread di SwingWorker.

Purtroppo, non ha alcun effetto sul thread creato da javax.naming.spi.NamingManager.getInitialContext() quando si utilizza un URL LDAP, utilizzando JavaSE 1.6. Senza dubbio ci sono altre eccezioni.