当前位置:  开发笔记 > 编程语言 > 正文

如何检测Java中全局抛出异常的时间?

如何解决《如何检测Java中全局抛出异常的时间?》经验,为你挑选了2个好方法。

如何检测应用程序中何处抛出异常?

每当我的Java桌面应用程序中的任何地方抛出异常时,我都会尝试自动向我发送电子邮件.我这样想,我可以更积极主动.

我知道我可以在发生异常时明确地记录并通知我自己,但我必须在任何地方都这样做,我可能(更有可能)会错过一对.

有什么建议?



1> shemnon..:

你可能不希望邮寄任何异常.JDK中有很多代码,它们依赖于异常才能正常工作.我认为你更不感兴趣的是未被捕获的例外.如果要捕获异常,则应在此处理通知.

在桌面应用程序中,有两个地方需要担心,在事件派发线程(EDT)和EDT之外.Globaly你可以通过注册实现java.util.Thread.UncaughtExceptionHandler和注册它的类java.util.Thread.setDefaultUncaughtExceptionHandler.如果异常结束到堆栈的底部并且线程没有在线程或ThreadGroup上的当前线程实例上设置处理程序,则会调用此方法.

EDT有一个不同的钩子来处理异常.系统属性'sun.awt.exception.handler'需要使用零参数构造函数的类的完全限定类名注册.这个类需要一个Throwable实现你的工作的实例方法handle().返回类型无关紧要,因为每次都创建一个新实例,所以不要指望保持状态.

因此,如果您不关心示例中发生异常的线程可能如下所示:

class ExceptionHandler implements Thread.UncaughtExceptionHandler {
  public void uncaughtException(Thread t, Throwable e) {
    handle(e);
  }

  public void handle(Throwable throwable) {
    try {
      // insert your e-mail code here
    } catch (Throwable t) {
      // don't let the exception get thrown out, will cause infinite looping!
    }
  }

  public static void registerExceptionHandler() {
    Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());
    System.setProperty("sun.awt.exception.handler", ExceptionHandler.class.getName());
  }
}

将此类添加到一些随机包中,然后调用该registerExceptionHandler方法,您应该准备好了.


你确定无限循环部分吗?UncaughtExceptionHandler.uncaughtException(...)的文档指出:Java虚拟机将忽略此方法抛出的任何异常.(参见:file:///usr/lib/jvm/java-6-sun/docs/api/java/lang/Thread.UncaughtExceptionHandler.html)
为什么需要最后一行System.setProperty("sun.awt.exception.handler",ExceptionHandler.class.getName()); 没有这条线就行了.而sun.awt可能特定于太阳的实现我想.

2> Jason Cohen..:

Java 1.5中的新调试挂钩允许您执行此操作.它允许例如在调试器中"中断任何异常".

这是您需要的特定Javadoc.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有