我正在开展大规模的应用程序。我小心翼翼地尝试处理所有异常(如果可能的话,事先防止它们)。但由于应用程序规模很大,有时会抛出一些异常。在我的开发环境中工作时(即从eclipse启动应用程序),我可以看到应用程序发生的位置,去那里,看看我能做些什么。问题在于 - 在开发过程中 - 我已经有其他人已经对应用程序(公司内部)进行了“测试工作”。他们给了我很多反馈,我喜欢。现在,如果在他们的应用程序中抛出异常,我就无法知道这个异常的创建位置。
我见过通过对话框向用户显示未捕获异常的应用程序。虽然我肯定不希望在客户版本中发生这种情况,但如果我可以在调试版本中执行此操作,则可能会有很大帮助。这可能吗?
简而言之:是否可以捕获多线程Java应用程序的所有抛出和未捕获异常?
编辑:有人问我,代码是如何运行的。我在eclipse中创建了一个包含所有库和类文件的runnable jar。然后我使用Launch4j将此jar打包成可执行文件。然后使用此可执行文件运行应用程序(使用Innosetup将其与ressource文件一起打包到setup.exe中,但我想这不是那么重要。)
Codewise,我有一个ThreadManager,可以启动所有必要的类(包括gui),但不一定会保留所有这些类的句柄。
答案 0 :(得分:3)
使用Thread.setDefaultUncaughtExceptionHandler()
处理所有未被捕获的Exceptions
。
请参阅this
答案 1 :(得分:0)
您应该有一个记录所有异常的日志。此外,如果您使用的是log4j,则可以使用org.apache.log4j.net.SMTPAppender,如果记录了错误,它将向您发送电子邮件。这样,每次在应用程序中发生异常时,您都会收到一封电子邮件。
答案 2 :(得分:0)
所以你需要每个线程在死亡之前捕获所有Throwable(不仅仅是Exceptions)并将它们转储到日志中。
捕捉可以通过两种方式完成:
a)使用
覆盖run()try {
super.run()
} catch(Throwable ex) {
ex.printStackTrace(logWriter);
}
b)使用Thread.setDefaultUncaughtExceptionHandler()
如果你使用ThreadManager,那么创建你自己的ThreadFactory,它创建以某种方式记录异常的线程。