Files
2026-01-23 17:03:45 +08:00

100 lines
3.7 KiB
Java

//This file is part of SECONDO.
//Copyright (C) 2004, University in Hagen, Department of Computer Science,
//Database Systems for New Applications.
//SECONDO is free software; you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation; either version 2 of the License, or
//(at your option) any later version.
//SECONDO is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
//along with SECONDO; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package util.exceptionhandling;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import util.common.StringUtilities;
/**
* This class implements {@link Thread.UncaughtExceptionHandler}
* to handle all uncaught exceptions of the event dispatching thread.
* Implements a few utility methods
* @author D.Merle
*/
public class ExceptionHandler implements Thread.UncaughtExceptionHandler {
/**
* To implement Thread.UncaughtExceptionHandler this class needs a public constructor
* because uncaughtException(final Thread t, final Throwable e) is an instance method.
*/
public ExceptionHandler() {
}
/**
* This method displays an exception in an error dialog
* @param owner The the owner or parent of the error dialog
* @param exception The exception to be shown
* @param additionalMessage An additional error message
*/
public static void showException(final JFrame owner, final Throwable exception, final String additionalMessage) {
String message = null;
if(StringUtilities.isStringNull(additionalMessage)) {
message = getTextRepresentationOfThrowable(exception);
} else {
message = getTextRepresentationOfThrowable(new Exception(additionalMessage, exception));
}
final JTextArea textArea = new JTextArea();
textArea.setText(message);
final JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setPreferredSize(new Dimension(500, 300));
JOptionPane.showMessageDialog(owner, scrollPane, "An error occured", JOptionPane.ERROR_MESSAGE);
}
/**
* Method to create a proper error text for a Throwable.
* It appends all Stacktrace elements and does a recursive call to itself when a Throwable
* has another "cause".
*/
private static String getTextRepresentationOfThrowable(final Throwable throwable) {
final StringBuilder builder = new StringBuilder();
if(throwable != null) {
builder.append(throwable.toString()).append("\n");
final StackTraceElement[] stackTraceElements = throwable.getStackTrace();
for (final StackTraceElement stackTraceElement : stackTraceElements) {
builder.append(stackTraceElement.toString()).append("\n");
}
if(throwable.getCause() != null) {
builder.append("Caused by:\n");
builder.append(getTextRepresentationOfThrowable(throwable.getCause()));
}
}
return builder.toString();
}
/**
* Uncaught exceptions result in a separate error dialog
*/
@Override
public void uncaughtException(final Thread t, final Throwable e) {
final JTextArea textArea = new JTextArea();
textArea.setText(StringUtilities.appendStrings("An uncaught error occured on the event-dispatching-thread!", getTextRepresentationOfThrowable(e)));
final JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setPreferredSize(new Dimension(500, 300));
JOptionPane.showMessageDialog(null, scrollPane);
}
}