Vogliamo una traccia nei registri delle applicazioni di queste eccezioni: per impostazione predefinita, Java li invia semplicemente alla console.Come posso rilevare le eccezioni del thread AWT in Java?
risposta
Esiste una distinzione tra le eccezioni non rilevate nell'EDT e all'esterno dell'EDT.
Another question has a solution for both ma se si desidera solo la parte EDT masticato ...
class AWTExceptionHandler {
public void handle(Throwable t) {
try {
// insert your exception handling code here
// or do nothing to make it go away
} catch (Throwable t) {
// don't let the exception get thrown out, will cause infinite looping!
}
}
public static void registerExceptionHandler() {
System.setProperty('sun.awt.exception.handler', AWTExceptionHandler.class.getName())
}
}
Ci sono due modi:
- /* installare un Thread.UncaughtExceptionHandler sul EDT */
- Impostare una proprietà di sistema: System.setProperty ("sun.awt.exception.handler", MyExceptionHandler.class.getName());
Non so se quest'ultimo funziona su jvms non SUN.
-
Infatti, il primo non è corretta, è solo un meccanismo per rilevare un filo precipitato.
Utilizzo di Thread.UncaufhtExceptionHandler non rileva le eccezioni EDT. La classe EDT cattura tutti i materiali da gettare e li stampa, piuttosto che lasciarli svolgere l'intero thread. – shemnon
Mancano anche dettagli su ciò che è necessario nella seconda opzione, la classe MyExceptionHandler deve avere un metodo di istanza handle (Throwable) accessibile e un costruttore no-args accessibile. – shemnon
Un po 'Oltre a shemnon s Anwer:
la prima volta un RuntimeException non rilevata (o errore) si verifica nel EDT sta cercando la proprietà "sun.awt.exception.handler" e prova a caricare la classe associata alla proprietà. EDT richiede che la classe Handler abbia un costruttore predefinito, altrimenti l'EDT non lo userà.
Se è necessario portare un po 'più di dinamica nella storia di gestione, si è costretti a farlo con operazioni statiche, poiché la classe viene istanziata dall'EDT e quindi non ha possibilità di accedere ad altre risorse diverse da quelle statiche. Ecco il codice del gestore delle eccezioni dal nostro framework Swing che stiamo utilizzando. È stato scritto per Java 1.4 e ha funzionato abbastanza bene lì:
public class AwtExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(AwtExceptionHandler.class);
private static List exceptionHandlerList = new LinkedList();
/**
* WARNING: Don't change the signature of this method!
*/
public void handle(Throwable throwable) {
if (exceptionHandlerList.isEmpty()) {
LOGGER.error("Uncatched Throwable detected", throwable);
} else {
delegate(new ExceptionEvent(throwable));
}
}
private void delegate(ExceptionEvent event) {
for (Iterator handlerIterator = exceptionHandlerList.iterator(); handlerIterator.hasNext();) {
IExceptionHandler handler = (IExceptionHandler) handlerIterator.next();
try {
handler.handleException(event);
if (event.isConsumed()) {
break;
}
} catch (Throwable e) {
LOGGER.error("Error while running exception handler: " + handler, e);
}
}
}
public static void addErrorHandler(IExceptionHandler exceptionHandler) {
exceptionHandlerList.add(exceptionHandler);
}
public static void removeErrorHandler(IExceptionHandler exceptionHandler) {
exceptionHandlerList.remove(exceptionHandler);
}
}
Spero che sia d'aiuto.
Dal momento che Java 7, devi farlo in modo diverso come l'hack sun.awt.exception.handler
non funziona più.
Here is the solution (da Uncaught AWT Exceptions in Java 7).
// Regular Exception
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());
// EDT Exception
SwingUtilities.invokeAndWait(new Runnable()
{
public void run()
{
// We are in the event dispatching thread
Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler());
}
});
- 1. come rilevare le eccezioni e continuare l'elaborazione in Java
- 2. Come posso rilevare le eccezioni di lettura in Haskell?
- 3. eccezioni java thread
- 4. Quando rilevare le eccezioni?
- 5. Java: crea grafica senza awt?
- 6. Come rilevare le eccezioni all'interno di BlockCode (obiettivo C)
- 7. Come posso rilevare le eccezioni dal commit delle transazioni gestite del contenitore?
- 8. driver java mongodb come si rilevano le eccezioni?
- 9. Come rilevare l'accesso incrociato in .NET (impone l'affinità del thread)?
- 10. Ruby c extensions: come posso rilevare tutte le eccezioni, incluse le cose che non sono StandardErrors?
- 11. Come posso vedere un registro completo delle eccezioni in JAVA?
- 12. Come trattare le eccezioni thread non gestite in ASP.NET?
- 13. Come rilevare le eccezioni nelle azioni del controllore in modo corretto?
- 14. Perché le eccezioni del runtime sono "deselezionate" in Java?
- 15. Come recuperare e gestire le eccezioni in ExecutorService di Java
- 16. Come posso rilevare l'eccezione di violazione del vincolo da EclipseLink?
- 17. Java Awt Robot cambia la velocità del mouse Windows
- 18. È possibile rilevare tutte le eccezioni tranne le eccezioni di runtime?
- 19. Come rilevare correttamente le eccezioni PHP (Laravel 5.1)
- 20. Come gestire le eccezioni da un thread di BackgroundWorker?
- 21. Come posso rilevare questa eccezione in Swing?
- 22. Asserire eccezioni in Java, come?
- 23. Come posso rilevare le modifiche su% ENV?
- 24. Come posso creare i thread del daemon?
- 25. Eccezioni Java Eccezioni C++
- 26. Posso disabilitare le eccezioni in AWL?
- 27. Come ignorare eccezioni in Java
- 28. composizione del processo ed eccezioni
- 29. Come gestisco le eccezioni quando utilizzo thread e coda?
- 30. Come posso ottenere l'unittest di Python per non rilevare le eccezioni?
Non è necessario prendere il tiro. Non ci sarà il loop infinito. java.awt.EventDispatchThread.handleException sta rilevando qualsiasi eccezione per te. –
Si dice che 'classi AWTExceptionHandler' –