Here\'s some code that catches an exception thrown on the Event Dispatch Thread:
package com.ndh.swingjunk;
import java.awt.EventQueue;
import javax.swing.
You've called setDefaultUncaughtExceptionHandler
instead of setUncaughtExceptionHandler
. (If a SecurityManager
is present: the former requires RuntimePermission setDefaultUncaughtExceptionHandler
; the latter as SecurityManager.checkAccess(Thread)
.)
The EDT class (java.awt.EventDispatchThread
, don't look for it in the javadoc, this class is package private) has changed a lot since the origins of AWT.
In JDK6, you can see that this class now can properly handle exceptions occuring inside the EDT. Exception handling is a bit complex in the current version:
sun.awt.exception.handler
property,
then your handler will be called for
every exception thrown by developer's
code called inside the EDT
(compatibility with previous JDK
versions is ensured).UncaughtExceptionHandler
will be
able to catch it, as your snippet
demonstrates.BUT (and this is very important), if you carefully look at the code of EDT, you'll see that this mechanism won't work if the exception occurs in the EDT while a modal dialog is displayed (I guess this is because EDT and EventQueue
management is quite complicated and I would even dare say "messy": a lot of code looks like hacks in there).
In this exact situation, exceptions will be logged to System.err
, except if you have set the sun.awt.exception.handler
property. Having a default UncaughtExceptionHandler
will not help.
So my take on this is that, YES, you should still bother with sun.awt.exception.handler
property, except if you can say for sure that your application doesn't use modal dialogs (don't forget that JOptionPane
dialogs are also modal).