Swing Abfangen von Fehlern in GUI

Crian

Top Contributor
Anders als in einem "normalen" Programm, in welchem ich theoretisch um den Aufruf in
Code:
main()
einen try .. catch. Block legen könnte, um RuntimeExceptions aufzufangen und dem Benutzer anzuzeigen, ist das in einer Gui-Anwednung so leider nicht möglich, da das Ende der
Code:
main()
schon gleich zu Beginn erreicht wird und der Rest im Thread der Swing-Anwendung passiert.

Gibt es einen Ansatzpunkt, an dem ich auf ähnliche Weise Fehler auffangen kann? Natürlich wäre es das beste, wenn diese gar nicht erst auftreten, aber ich würde gerne, dass die Anwender mir über Fehler berichten können und diese nicht einfach in einer Konsole "verschwinden".
 
Zuletzt bearbeitet von einem Moderator:

Mujahiddin

Top Contributor
Anders als in einem "normalen" Programm, in welchem ich theoretisch um den Aufruf in
Code:
main()
einen try .. catch. Block legen könnte, um RuntimeExceptions aufzufangen und dem Benutzer anzuzeigen, ist das in einer Gui-Anwednung so leider nicht möglich, da das Ende der
Code:
main()
schon gleich zu Beginn erreicht wird und der Rest im Thread der Swing-Anwendung passiert.

Gibt es einen Ansatzpunkt, an dem ich auf ähnliche Weise Fehler auffangen kann? Natürlich wäre es das beste, wenn diese gar nicht erst auftreten, aber ich würde gerne, dass die Anwender mir über Fehler berichten können und diese nicht einfach in einer Konsole "verschwinden".

Wie passieren denn Fehler? Sicher nicht in deiner GUI - natürlich ist es möglich, dass Java Swing noch einige Bugs hat, aber sehr unwahrscheinlich.

Die Fehler passieren entweder in ActionListener oder MouseListener oder sonstiges, welche vom EDT aufgerufen werden, wenn ein Button geklickt wird. In deiner Konsole steht dann doch auch der StackTrace und bei solchen stellen machst du eben ein try-catch Block hin.
Ich kann dir mal eine "Standard"-Methode geben, wie du Fehler ausgibst. Kannst es natürlich noch anpassen:

Java:
static void showErrorDialog(Throwable e) {
	e.printStackTrace(); // wäre theoretisch nicht mehr nötig
	String detail = e.getClass().getName() + ": " + e.getMessage();
	for( final StackTraceElement s : e.getStackTrace() )
		detail += "\n\t" + s.toString();
	while( ( e = e.getCause() ) != null ) {
		detail += "\nCaused by: ";
		for( final StackTraceElement s : e.getStackTrace() )
			detail += "\n\t" + s.toString();
	}
	showErrorDialog( detail );
}

static void showErrorDialog(final String detail) {
	final JFrame errorFrame = new JFrame();
	final JTextPane errorArea = new JTextPane();
	errorArea.setText( detail );
	int width = errorArea.getPreferredSize().width;
	if( width > 400 )
		width = 400;
	int height = errorArea.getPreferredSize().height;
	if( height > 400 )
		height = 400;
	errorArea.setPreferredSize( new Dimension( width, height ) );
	errorArea.setEditable( false );
	final JOptionPane errorPane = new JOptionPane( new Object[] { "Ein Fehler ist aufgetreten:", new JScrollPane( errorArea ) }, JOptionPane.ERROR_MESSAGE, JOptionPane.DEFAULT_OPTION );
	final JDialog errorDialog = errorPane.createDialog( errorFrame, "Fehler!" );
	Toolkit.getDefaultToolkit().beep();
	errorDialog.addWindowListener( new WindowAdapter() {
		
		@Override
		public void windowClosing(final WindowEvent e1) {
			errorDialog.dispose();
		}
	} );
	errorDialog.setAlwaysOnTop( true );
	errorDialog.setVisible( true );
}
 

Crian

Top Contributor
Einen Fehlerdialog hab ich schon, sogar mit ein- und ausblendbaren Details (Stacktrace). Dafür allerdings Throwable zu nehmen statt Exception ist sehr sinnvoll und werde ich auch übernehmen.

Klar kann ich alle nach und nach selbst mit try catch umgeben, ich wollte nur gern an einer zentralen Stelle möglichst alles einfangen. Das scheint nun leider wohl nicht so einfach zu sein.
 
S

SlaterB

Gast
du brauchst schon für jede Listener-Art eine eigenen Basisklasse,
oder du verwendest eine weitere Indirektion:
jeder Listener erzeugt auch nur wieder eine Art Event, die in irgendeinen allgemeinen Controller geht und an bestimmte Methoden weitergeleitet wird, aber kontrolliert von zentraler Codestelle,

ob man an quasi dasselbe Konstrukt irgendwo im EventDispatchThread usw. herankommt?..


----

siehe auch
java - How do I catch this exception in Swing? - Stack Overflow
könnte auch für Listener funktionieren
 

Crian

Top Contributor
Danke. Ich hab erstmal angefangen, alle Listener einzeln zu umgeben. So viele sind das momentan auch nicht, dass es zu unhandlich wäre.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
CodingBerlin Mouse Clicks abfangen Allgemeine Java-Themen 4
X jvm exception abfangen und an externes Programm schicken Allgemeine Java-Themen 4
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
E Exceptions abfangen und dann Programm stoppen - aber wie? Allgemeine Java-Themen 2
T Daten über port abfangen mit proxy server Allgemeine Java-Themen 12
M Swing java command line abfangen Allgemeine Java-Themen 8
R Threads Exceptions von Threads abfangen im ThreadPool Allgemeine Java-Themen 5
C Kopiervorgang abfangen Allgemeine Java-Themen 10
T Methoden In Konsole tasten abfangen? Allgemeine Java-Themen 4
B Windows Shutdown abfangen Allgemeine Java-Themen 10
O Input/Output CMD-Ausgabe abfangen und in Datei speichern Allgemeine Java-Themen 8
D Nullpointer abfangen Allgemeine Java-Themen 7
V JNI Call Crash verhindern (abfangen) Allgemeine Java-Themen 2
E JAVA URL abfangen und weiterleiten? Filter? Allgemeine Java-Themen 6
F Alle Exceptions abfangen Allgemeine Java-Themen 4
reibi NoClassDefFoundError abfangen Allgemeine Java-Themen 6
N BlueJ Abfangen vom Beenden Allgemeine Java-Themen 7
B Alle Exceptions auf einmal abfangen Allgemeine Java-Themen 4
B Exception wird geworfen, ich darf sie aber nicht abfangen. Allgemeine Java-Themen 10
P [SWT] Copy, Paste und Cut abfangen Allgemeine Java-Themen 6
T WeakHashMap: Wie "null" effizient abfangen? Allgemeine Java-Themen 5
R Loading-Thread und Exceptions abfangen. Allgemeine Java-Themen 4
G Tastatursignale abfangen oder ist Java dafuer zu abstrakt? Allgemeine Java-Themen 12
I Das EOF (Ctrl + Z) abfangen Allgemeine Java-Themen 8
E programm im background tastendruck abfangen Allgemeine Java-Themen 4
H NullPointerException trotz Abfangen von null? Allgemeine Java-Themen 9
M Speichern von Word als Event abfangen Allgemeine Java-Themen 7
W Das schließen des JFrame abfangen, wiei? Allgemeine Java-Themen 6
P Nicht terminierende Methoden abfangen - timeout ? Allgemeine Java-Themen 3
reibi Aktion Taste gedrückt abfangen Allgemeine Java-Themen 9
G Bildschirmänderung abfangen? Allgemeine Java-Themen 4
J Method.invoke -> Exceptions der Funktion abfangen Allgemeine Java-Themen 5
B Fehlermeldung von dispatcher.forward abfangen Allgemeine Java-Themen 2
P CLAmp-Ausgaben abfangen Allgemeine Java-Themen 2
H Programmterminierung abfangen Allgemeine Java-Themen 4
R Alle Konsolenausgaben abfangen Allgemeine Java-Themen 8
G outOfMemoryError beim Einlesen einer Datei abfangen? Allgemeine Java-Themen 13
F Überlauf abfangen Allgemeine Java-Themen 1
J ToolTipText Event abfangen Allgemeine Java-Themen 5
M unterschiedliche Betriebssysteme abfangen Allgemeine Java-Themen 3
C LinkedList Exception abfangen Allgemeine Java-Themen 8
0 StackOverflow abfangen Allgemeine Java-Themen 15
M Runtime.getRuntime().exec() - Fehler abfangen Allgemeine Java-Themen 5
L Tastatureingaben abfangen Allgemeine Java-Themen 6
M err oder alle Exceptions eines Programms abfangen Allgemeine Java-Themen 4
M Eclipse Keine Ausgabe mehr bei Fehlern Allgemeine Java-Themen 3
H Decrementieren mit Fehlern Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben