Я не знаю, является ли это лучшим из того, что сейчас предлагает Java, но это то, что я делал некоторое время назад.
Сначала вся интересная деятельность, которая может привести к сбою, отправлялась через шаблон команды. Это приложение состояло из попадания на сервер приложений через Интернет, поэтому многое могло пойти не так. Исключения были перехвачены диспетчером команд, и пользователю был показан соответствующий результат (как правило, показывающий диалоговое окно с сообщением об ошибке, за которым следовало завершение работы и электронное письмо о сбое).
Во-вторых, пользовательская очередь событий использовалась в Swing для перехвата любых исключений, которые происходят в потоке событий. Я хотел бы надеяться, что в настоящее время у Java есть лучшее решение, но в основном, когда произошло исключение, вам пришлось проверить, не был ли задействован ваш код, в противном случае некоторые ошибки Swing могут привести к сбою в вашем приложении, что неприятно. И, конечно, рекурсия должна быть проверена (сбой повторяется снова и снова, когда вы пытаетесь отобразить сообщение пользователю).
Кстати, большинство любых сбоев будут поддерживать работу вашей JVM, включая ошибки нехватки памяти, в большинстве случаев достаточные для отправки электронной почты, так как после ошибки нехватки памяти обычно ошибка освобождает достаточно стека (и следовательно, куча) для дальнейшей сборки мусора и запуска вашего кода. Но в таком случае вы все равно должны быстро выйти. IDEA продолжает работать после ошибки нехватки памяти, но часто не работает должным образом. Им лучше выйти, ИМО.
Вы выдвигаете новую очередь со следующим и создаете подкласс EventQueue для связи в своем поведении.
Toolkit.getDefaultToolkit().getSystemEventQueue().push(newQueue);