2

我正在开发一个大规模的应用程序。我小心翼翼地尝试处理所有异常(并尽可能提前阻止它们)。但由于应用规模较大,有时会抛出一些异常。在我的开发环境中工作时(即从 eclipse 启动应用程序),我可以看到应用程序出现在哪里,去那里,看看我能做些什么。问题是 - 在开发过程中 - 我已经让其他人(在公司内部)使用该应用程序“进行某种测试”。他们给了我很多反馈,我很喜欢。现在,如果在他们的应用程序中抛出异常,我无法判断这个异常是在哪里创建的。

我已经看到应用程序通过对话框向用户显示未捕获的异常。虽然我当然不希望在客户版本中发生这种情况,但如果我可以在调试版本中做到这一点,可能会有很大帮助。这可能吗?

简而言之:是否可以捕获多线程 Java 应用程序的所有抛出和未捕获的异常?

编辑:有人问我,代码是如何运行的。我在 Eclipse 中创建了一个可运行的 jar,其中包含所有库和类文件。然后我使用Launch4j将这个 jar 打包到一个可执行文件中。然后使用这个可执行文件来运行应用程序(它与使用Innosetup的资源文件一起打包到 setup.exe 中,但我想这不是那么重要)。

在代码方面,我有一个 ThreadManager 可以启动所有必要的类(包括 gui),但不必保留所有这些类的句柄。

4

3 回答 3

3

用来Thread.setDefaultUncaughtExceptionHandler()处理所有未捕获Exceptions的。

看到这个

于 2012-06-15T09:13:20.910 回答
0

您应该有一个记录所有异常的日志。此外,如果您使用 log4j,您可以使用 org.apache.log4j.net.SMTPAppender,如果记录了错误,它将向您发送一封电子邮件。这样,每当应用程序中发生异常时,您都会收到一封电子邮件。

于 2012-06-15T09:19:02.243 回答
0

因此,您需要每个线程在死亡之前捕获所有 Throwable(不仅仅是异常)并将它们转储到日志中。

捕捉可以通过两种方式完成:

a) 覆盖 run() 与

try {
   super.run()
 } catch(Throwable ex) {
   ex.printStackTrace(logWriter);
 }

b) 使用Thread.setDefaultUncaughtExceptionHandler()

如果您使用 ThreadManager,则创建您自己的 ThreadFactory,它创建以一种或另一种方式记录异常的线程。

于 2012-06-15T10:57:18.923 回答