Java: Laufzeitausnahmen anzeigen

Im 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 (aktuellere Variante):

  • Ersetzen der AWT-EventQueue durch eine, die bei nicht gefangenen Ausnahmen einen Dialog anzeigt
  • Dieser Dialog bietet dem Benutzer an, den Fehler per E-Mail zu übermitteln

Eigene Queue:

public final class AppEventQueue extends java.awt.EventQueue {
    @Override
    protected void dispatchEvent(AWTEvent event) {
        try {
            super.dispatchEvent(event);
        } catch (Throwable t) {
            LOGGER.log(Level.SEVERE, null, t);
            showErrorDialog(t);
        }
    }

    private void showErrorDialog(Throwable t) {
        boolean modal = true;
        LongMessageDialog dialog = new LongMessageDialog(getAppFrame(), modal);

        dialog.setTitle(Bundle.getString("AppEventQueue.Error.Title"));
        dialog.setErrorIcon();
        dialog.setMail(AppInfo.MAIL_TO_ADDRESS_BUGS, AppInfo.MAIL_SUBJECT_BUGS);
        dialog.setShortMessage(Bundle.getString("AppEventQueue.Error.Message"));
        dialog.setLongMessage(createMessage(t));

        dialog.setVisible(true);
    }

    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):

JPhotoTagger: Dialog bei nicht gefangenen Ausnahmen

Hinweis

So, wie oben beschrieben, werden die nicht gefangenen Ausnahmen im EventDispatchThread angezeigt. Für andere Threads ist das ebenfalls zu erledigen in einem Handler, der gesetzt wird mit Thread.setDefaultUncaughtExceptionHandler(). Die Methode setDefaultUncaughtExceptionHandler() wirkt sich nicht aus auf den AWT-EventDispatchThread, (nur) deshalb wird eine eigene EventQueue zu diesem Zweck benutzt.

Stichwörter: , ,

Zu diesem Artikel können keine Kommentare mehr geschrieben werden.