如何检测应用程序中何处抛出异常?
每当我的Java桌面应用程序中的任何地方抛出异常时,我都会尝试自动向我发送电子邮件.我这样想,我可以更积极主动.
我知道我可以在发生异常时明确地记录并通知我自己,但我必须在任何地方都这样做,我可能(更有可能)会错过一对.
有什么建议?
she*_*non 37
你可能不希望邮寄任何异常.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方法,您应该准备好了.
| 归档时间: | 
 | 
| 查看次数: | 9840 次 | 
| 最近记录: |