Catching uncaught exceptions

I’ve been looking to simplify some exception handling code recently, namely I wanted to get rid of much of the defencive exception handling placed in event handlers in a Swing UI. Code like this:


	

public void actionPerformed(ActionEvent event) { try{ //Do something ... }catch(Exception e){ //handle exception ... }
}

What the code is trying to do is make sure is that any exception thrown is brought to the attention of the user. I’ve been looking at a few approaches to help catch and handle these exceptions without the developer having to explicitly catch them at the UI level.

Create your own EventQueue

You can create your own EventQueue, and have it catch uncaught exceptions when dispatching methods, like so:


	

public class ExceptionHandlingEventQueue extends EventQueue { public void dispatchEvent(AWTEvent event) { try { super.dispatchEvent(event); } catch (Exception e) { //handle exception ... } }
}

To use your new ExceptionHandlingEventQueue, install it like so:


	

Toolkit.getDefaultToolkit().getSystemEventQueue().push(this);

This will let you catch exceptions thrown directly from event code, so using a contrived example, this event handler will throw and exception that our dispatchEvent will catch:


	

public void actionPerformed(ActionEvent e) { throw new UnsupportedOperationException("Method not implemented");
}

If however an operation is started in its own Thread and then throws an exception, we’ll be unable to catch it – in this example the exception will not be caught by our dispatchEvent method:


	

public void actionPerformed(ActionEvent e) { Thread t = new Thread() { public void run() { throw new UnsupportedOperationException("Method not implemented"); } }; t.start();
}

Create your own ThreadGroup

Another approach is to start you UI within a subclasses ThreadGroup, and override its uncaughtException method:


	

public class ExceptionHandlingThreadGroup extends ThreadGroup { public void uncaughtException(Thread t, Throwable e) { //handle exception ... }
}

Now, if you start and of your threads as a child of a ExceptionHandlingThreadGroup, any uncaught exception will be caught and handled. If you abstract out your Thread creation by using a factory, making all Thread instances a child of your own ThreadGroup shouldn’t be too much bother…

Or just wait for Java 5

In Java 5, the Thread class adds support for adding uncaught exception handlers, using @Thread.setDefaultUncaughtExceptionHandler@ and @Thread.setUncaughtExceptionHandler@. From the Java 5 API:

public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) Set the handler invoked when this thread abruptly terminates due to an uncaught exception. A thread can take full control of how it responds to uncaught exceptions by having its uncaught exception handler explicitly set. If no such handler is set then the thread’s ThreadGroup object acts as its handler.

This entry was posted on Wednesday, July 21st, 2004 at 11:18 am and is filed under Java. You can follow any responses to this entry through the RSS 2.0 feed. You can skip to the end and leave a response. Pinging is currently not allowed.

One Response to “Catching uncaught exceptions”

Just for reference, Netbeans uses the ThreadGroup approach to handle ‘when all else fails’ sort of exceptions.

Have your say





Fields in bold are required. Email addresses are never published or distributed.

Some HTML code is allowed:

URIs must be fully qualified (eg: http://www.domainname.com) and all tags must be properly closed.

Line breaks and paragraphs are automatically converted.

Please keep comments relevant. Off-topic, offensive or inappropriate comments may be edited or removed.