2011-12-02 10 views
10

Voglio definire un livello applicazione UncaughtExceptionHandler nella mia applicazione Java che viene chiamata se un'eccezione non rilevata viene generata in un thread della mia applicazione. So che è possibile definire un'eccezione non rilevata per un gruppo di thread (ThreadGroup) e lo sto effettivamente utilizzando, ma voglio definire un'eccezione non rilevata globale per i thread che non hanno definito il proprio gestore di eccezioni non rilevati o che non sono associati a un gruppo di thread con un gestore di eccezioni predefinito definito.Definizione di un UncaughtExceptionHandler globale per tutti i thread della mia applicazione

Così, per esempio, voglio raggiungere qualcosa di simile:

1° LEVEL ---> Call thread own UncaughtExceptionHandler ---> 2° LEVEL Call Thread Group UncaughtExceptionHandler ---> 3° LEVEL Call application(default) UncaughtExceptionHandler 

In termini semplici voglio ignorare l'impostazione predefinita UncaughtExceptionHandler e definire il mio gestore, invece di stampare l'analisi dello stack sul System.err (che è il default comportamento).

Per esempio in C# .NET faccio qualcosa di simile movimentazione eccezione gestore di eventi non gestita e thread nel metodo Main() dell'applicazione:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 

può essere fatto anche in Java?

Come è possibile eseguire l'override di UncaughtExceptionHandler predefinito in Java?

risposta

16

Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler ex)

Questo dovrebbe ottenere quello che stai cercando.

Come doc dice

Impostare il gestore predefinito invocato quando un thread termina bruscamente a causa di un'eccezione non rilevata, e nessun altro gestore è stato definito per quello thread.

E una nota interessante (anche nella documentazione) voi per quanto riguarda utilizzando il gestore del ThreadGroup

Si noti che il gestore predefinito eccezioni non rilevate non dovrebbe di solito rinviare all'oggetto ThreadGroup del thread, come quello potrebbe causare la ricorsione infinita .

+0

È valido per tutti i thread dell'applicazione o è valido solo per il thread corrente in cui è definito? Dovrebbe essere definito nel metodo principale dell'applicazione? – aleroot

+1

È impostato come campo statico nella classe Thread e non come campo locale del thread. Quindi sarebbe valido per tutti i thread nell'applicazione. Può essere definito nel metodo principale, ma probabilmente lo si vorrebbe definire all'interno del blocco 'static' della classe principale. –

+0

@JohnVint Potete aggiornare la risposta con il commento sopra. Per me è stato facile capire quando hai detto che è un campo statico nella classe Thread – Gerrard

4

È necessario impostare il gestore di eccezioni non rilevati predefinito. Questo è un metodo statico nella classe Thread chiamata setDefaultUncaughtExceptionHandler. In questo modo si imposta il gestore delle eccezioni per l'applicazione in esecuzione. Sarà l'impostazione predefinita per qualsiasi nuovo thread, se non diversamente specificato.

Problemi correlati