Domanda

Sto lavorando su un'applicazione multipiattaforma in Java che attualmente funziona bene su Windows, Linux e MacOS X.Sto cercando di trovare un modo carino per rilevare (e gestire) gli "arresto anomali".Esiste un modo semplice e multipiattaforma per rilevare "arresto anomalo" in Java e fare qualcosa in risposta?

Immagino che per " arresti anomali " intendo eccezioni non rilevate.Tuttavia, il codice utilizza un po' di JNI, quindi sarebbe bello poter rilevare arresti anomali dovuti a un codice JNI errato, ma ho la sensazione che sia specifico per JVM.

È stato utile?

Soluzione

Per una semplice gestione generale, è possibile utilizzare il seguente metodo statico in Filo.Dal Javadoc:

vuoto statico setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ehi)
Imposta il gestore predefinito richiamato quando un thread termina improvvisamente a causa di un'eccezione non rilevata e nessun altro gestore è stato definito per quel thread.

Questo è un modo molto ampio per gestire errori o eccezioni non controllate che potrebbero non essere rilevate da nessun'altra parte.

Nota a margine: È meglio se il codice può rilevare, registrare e/o ripristinare le eccezioni più vicine all'origine del problema.Vorrei riservare questo tipo di gestione generalizzata degli incidenti a situazioni totalmente irrecuperabili (ad es.sottoclassi di java.lang.Error).Cerca di evitare la possibilità di a RuntimeException mai completamente inosservato, poiché potrebbe essere possibile (e preferibile) che il software sopravviva a ciò.

Altri suggerimenti

Per gestire le eccezioni non rilevate è possibile fornire un nuovo ThreadGroup che fornisce un'implementazione di ThreadGroup.uncaughtException(...).È quindi possibile rilevare eventuali eccezioni non rilevate e gestirle in modo appropriato (ad es.inviare un registro degli arresti anomali a casa).

Non posso aiutarti sul fronte JNI, probabilmente c'è un modo di utilizzare un eseguibile wrapper nativo prima di chiamare la JVM, ma quell'eseguibile dovrà conoscere tutte le possibili JVM che potrebbe chiamare e come l'indicazione si blocca e dove vengono inseriti i registri degli arresti anomali, ecc.

Non sono sicuro che questo sia ciò di cui hai bisogno, ma puoi anche rilevare se si è verificata un'eccezione nel tuo codice nativo.Vedere http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp5234 per maggiori informazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top