Java: Laufzeitausnahmen anzeigen
Freitag, 2. April 2010Im vorherigen Artikel schrieb ich, meine public und protected-Methoden werfen Laufzeitausnahmen bei Programmierfehlern. Damit der Benutzer diese sieht und den Support benachrichtigen kann, gehe ich so vor:
- Ersetzen der
EventQueuedurch eine, die bei nicht gefangenen Ausnahmen einen Dialog anzeigt - Dieser Dialog bietet dem Benutzer an, den Fehler per E-Mail zu übermitteln
Eigene Queue:
/**
* JPhotoTagger's event queue.
* <p>
* Catches throwables and displays a dialog with information about the cause.
*
* @author Elmar Baumann
*/
public final class AppEventQueue extends java.awt.EventQueue {
@Override
protected void dispatchEvent(AWTEvent event) {
try {
super.dispatchEvent(event);
} catch (Throwable t) {
AppLogger.logSevere(AppEventQueue.class, t);
getDialog(t).setVisible(true);
}
}
private LongMessageDialog getDialog(Throwable t) {
LongMessageDialog dlg =
new LongMessageDialog(GUI.INSTANCE.getAppFrame(), true,
UserSettings.INSTANCE.getSettings(), null);
dlg.setTitle(JptBundle.INSTANCE.getString("AppEventQueue.Error.Title"));
dlg.setErrorIcon();
dlg.setMail(AppInfo.MAIL_TO_ADDRESS_BUGS, AppInfo.MAIL_SUBJECT_BUGS);
dlg.setShortMessage(
JptBundle.INSTANCE.getString("AppEventQueue.Error.Message"));
dlg.setLongMessage(createMessage(t));
return dlg;
}
private String createMessage(Throwable t) {
String message = AppLogger.getMessage(t);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
t.printStackTrace(ps);
return message + "\n" + baos.toString();
}
}
Screenshot des Dialogs (Fehler von gestern):

Referenzen: Catching all Runtime Exceptions in Swing und Questions About Exception Handling.