Нам нужны следы в журналах приложений этих исключений - по умолчанию Java просто выводит их на консоль.Как я могу использовать исключения AWT в Java?
ответ
Существует различие между неперехваченными исключениями в EDT и вне EDT.
Another question has a solution for both но если вы хотите только часть EDT разжевал ...
class AWTExceptionHandler {
public void handle(Throwable t) {
try {
// insert your exception handling code here
// or do nothing to make it go away
} catch (Throwable t) {
// don't let the exception get thrown out, will cause infinite looping!
}
}
public static void registerExceptionHandler() {
System.setProperty('sun.awt.exception.handler', AWTExceptionHandler.class.getName())
}
}
Есть два способа:
- /* Установите Thread.UncaughtExceptionHandler на EDT */
- Установить системное свойство: System.setProperty ("sun.awt.exception.handler", MyExceptionHandler.class.getName());
Я не знаю, работает ли последний на не-SUN jvms.
-
В самом деле, первый не является правильным, это лишь механизм для обнаружения разбитых нитей.
Использование Thread.UncaufhtExceptionHandler не будет ловить исключения EDT. Класс EDT улавливает все комбайны и печатает их, а не позволяет разматывать весь поток. – shemnon
Вы также не указали информацию о том, что необходимо во втором варианте, класс MyExceptionHandler должен иметь доступный метод экземпляра дескриптора (Throwable) и конструктор no-args. – shemnon
Немного дополнение к shemnon сек Anwer:
Первый раз неперехваченное RuntimeException (или ошибки) происходит в EDT ищет свойство «sun.awt.exception.handler» и пытается загрузить класс, связанный с этим свойством. EDT требует, чтобы класс Handler имел конструктор по умолчанию, иначе EDT не будет использовать его.
Если вам нужно привести немного большую динамику в историю обработки, вы вынуждены делать это со статическими операциями, потому что класс создается ЭДТ и поэтому не имеет доступа к другим ресурсам, отличным от статического. Вот код обработчика исключений из нашей среды Swing, которую мы используем. Это было написано для Java 1.4, и там хорошо работало:
public class AwtExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(AwtExceptionHandler.class);
private static List exceptionHandlerList = new LinkedList();
/**
* WARNING: Don't change the signature of this method!
*/
public void handle(Throwable throwable) {
if (exceptionHandlerList.isEmpty()) {
LOGGER.error("Uncatched Throwable detected", throwable);
} else {
delegate(new ExceptionEvent(throwable));
}
}
private void delegate(ExceptionEvent event) {
for (Iterator handlerIterator = exceptionHandlerList.iterator(); handlerIterator.hasNext();) {
IExceptionHandler handler = (IExceptionHandler) handlerIterator.next();
try {
handler.handleException(event);
if (event.isConsumed()) {
break;
}
} catch (Throwable e) {
LOGGER.error("Error while running exception handler: " + handler, e);
}
}
}
public static void addErrorHandler(IExceptionHandler exceptionHandler) {
exceptionHandlerList.add(exceptionHandler);
}
public static void removeErrorHandler(IExceptionHandler exceptionHandler) {
exceptionHandlerList.remove(exceptionHandler);
}
}
Надеюсь, это поможет.
Начиная с версии Java 7, вам нужно сделать это по-другому, так как ручка sun.awt.exception.handler
больше не работает.
Here is the solution (from Uncaught AWT Exceptions in Java 7).
// Regular Exception
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());
// EDT Exception
SwingUtilities.invokeAndWait(new Runnable()
{
public void run()
{
// We are in the event dispatching thread
Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler());
}
});
Не нужно ловить бросок. Не будет бесконечного цикла. java.awt.EventDispatchThread.handleException улавливает любые исключения для вас. –
Там говорится 'классы AWTExceptionHandler' –