如何检测应用程序中何处抛出异常?
每当我的Java桌面应用程序中的任何地方抛出异常时,我都会尝试自动向我发送电子邮件.我这样想,我可以更积极主动.
我知道我可以在发生异常时明确地记录并通知我自己,但我必须在任何地方都这样做,我可能(更有可能)会错过一对.
有什么建议?
你可能不希望邮寄任何异常.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
方法,您应该准备好了.
Java 1.5中的新调试挂钩允许您执行此操作.它允许例如在调试器中"中断任何异常".
这是您需要的特定Javadoc.