Java 全局捕获异常

Java 全局捕获异常,java,exception-handling,Java,Exception Handling,我正在开发一个大型应用程序。我会小心地处理所有的异常(如果可能的话,我会事先阻止它们)。但由于应用程序规模很大,有时会抛出一些异常。在我的开发环境中工作(即从eclipse启动应用程序)时,我可以看到应用程序发生在哪里,转到那里,并看到我可以对此做些什么。问题是,在开发过程中,我已经有其他人(在公司内部)对应用程序进行了“某种程度的测试”。他们给了我很多反馈,我很喜欢。现在,如果在他们的应用程序中抛出异常,我就无法知道该异常是在哪里创建的 我见过一些应用程序通过对话框向用户显示未修补的异常。虽然

我正在开发一个大型应用程序。我会小心地处理所有的异常(如果可能的话,我会事先阻止它们)。但由于应用程序规模很大,有时会抛出一些异常。在我的开发环境中工作(即从eclipse启动应用程序)时,我可以看到应用程序发生在哪里,转到那里,并看到我可以对此做些什么。问题是,在开发过程中,我已经有其他人(在公司内部)对应用程序进行了“某种程度的测试”。他们给了我很多反馈,我很喜欢。现在,如果在他们的应用程序中抛出异常,我就无法知道该异常是在哪里创建的

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

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

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


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

使用
Thread.setDefaultUncaughtExceptionHandler()
来处理所有未捕获的
异常


请参见

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

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

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

a) 将run()重写为

b) 使用
Thread.setDefaultUncaughtExceptionHandler()


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

“我无法确定该异常是在何处创建的”-您没有获得堆栈跟踪吗?如果没有,请修复…@JonSkeet如何“获取”堆栈跟踪?如果我的应用程序是在eclipse中运行的(因为堆栈跟踪被转储到控制台中),我可以看到它,但是当其他人启动它时,它被打包到一个jar中,而不是从eclipse中运行。我们不太了解代码是如何运行的,或者您是如何发现异常的,这让我很难回答…@JonSkeet我添加了一个编辑。如果您有一些代码在头脑中,我也可以添加。我没有发现异常(至少是我没有处理的异常),这是我的问题。如果未捕获异常,它将使我的应用程序崩溃,或使其无响应,或导致错误行为,或对应用程序没有影响。。。我只是希望所有这些未处理的异常都显示在某个地方(转储到文件中、异常对话框等等),这看起来很有趣。我来看看。这样你可以得到所有的
异常
,但是你的应用程序仍然会崩溃。用它来发现错误,然后改正它们,这才是我真正想要的。我不想全局捕获异常并处理它们。我认为那是一种糟糕的做法。我希望看到这些异常发生在哪里,然后在代码中更正它们,这样它们就不会再出现了。好的,这是一个好方法。在android上写作时,我用它创建了自己的日志,因为在android中没有其他方法可以捕捉到它们。谢谢,我喜欢秒方法+ThreadFactory建议。
try {
   super.run()
 } catch(Throwable ex) {
   ex.printStackTrace(logWriter);
 }