我们希望在我们的应用程序日志中跟踪这些异常——默认情况下,Java 只是将它们输出到控制台。
问问题
6655 次
4 回答
14
从 Java 7 开始,您必须以不同的方式进行操作,因为该sun.awt.exception.handler
hack 不再起作用。
这是解决方案(来自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());
}
});
于 2015-01-09T10:57:04.227 回答
10
EDT 内和 EDT 外未捕获的异常之间存在区别。
另一个问题对两者都有解决方案,但如果您只想咀嚼 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())
}
}
于 2008-09-18T21:27:40.877 回答
3
对shemnon的回答稍加补充:
第一次在 EDT 中发生未捕获的 RuntimeException(或错误)时,它正在寻找属性“sun.awt.exception.handler”并尝试加载与该属性关联的类。EDT 需要 Handler 类有一个默认的构造函数,否则 EDT 不会使用它。
如果您需要在处理故事中加入更多动态,则必须使用静态操作来执行此操作,因为该类由 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);
}
}
希望能帮助到你。
于 2008-09-20T06:50:06.670 回答
0
有两种方法:
- /* 在 EDT 上安装 Thread.UncaughtExceptionHandler */
- 设置系统属性:System.setProperty("sun.awt.exception.handler",MyExceptionHandler.class.getName());
我不知道后者是否适用于非 SUN jvm。
--
事实上,第一个是不正确的,它只是一种检测崩溃线程的机制。
于 2008-09-18T19:08:30.900 回答