package games.strategy.triplea.ui;
import games.strategy.debug.ClientLogger;
/**
* When dealing with swing threads and new threads, exception handling can get tricky. Namely without
* a handler to catch exceptions in these new threads, the stack traces will be poor. Specifically you
* will get a stack trace that points to where you started the thread and not to the actual line within
* the thread that had the problem.
*
* <p>
* To solve this unhandled exception handlers get registered. For more details, see:
* http://stackoverflow.com/questions/75218/how-can-i-detect-when-an-exceptions-been-thrown-globally-in-java#75439
* </p>
*/
public class ErrorHandler implements Thread.UncaughtExceptionHandler, ErrorHandlerAwtEvents {
@Override
public void uncaughtException(final Thread t, final Throwable e) {
handle(e);
}
/**
* Method used to handle errors. Called auto-magically by sun property
*/
@Override
public void handle(final Throwable throwable) {
try {
ClientLogger.logError(throwable);
} catch (final Throwable t) {
try {
// if client logger fails fall back to methods that may still work
final String msg =
"Original error: " + throwable.getMessage() + ", next error while handling it: " + t.getMessage();
System.err.println(msg);
t.printStackTrace();
} catch (final Throwable fatal) {
// Swallow this last error, if anything is thrown we can have an infinite loop of error handling.
}
}
}
/**
* Registers this class as an uncaught exception error handler.
*/
public static void registerExceptionHandler() {
Thread.setDefaultUncaughtExceptionHandler(new ErrorHandler());
System.setProperty("sun.awt.exception.handler", ErrorHandler.class.getName());
}
}