GUI应用程序中抛出未经检查的异常

时间:2009-10-10 15:18:32

标签: java exception-handling

我们知道,如果违反方法合同,则使用未经检查的例外情况。如果应用程序在控制台中运行,则异常将显示在控制台窗口中,以及其堆栈跟踪。即使从控制台调用的GUI应用程序(例如用Swing编写)也是如此,控制台在后台运行。

但是,如果GUI应用程序没有控制台会发生什么? E.g用户双击链接,应用程序直接启动,后台没有任何控制台。未处理的未经检查的例外情况会在哪里发生?

这个问题的原因是一些开发人员试图根据上述情况证明捕获未经检查的异常。

5 个答案:

答案 0 :(得分:2)

我认为GUI线程抛出的异常(无法进入控制台)完全被丢弃。他们不去任何地方。

此外,未经检查的例外肯定不一定“在违反方法合同的情况下使用”。关于这个问题存在很多争议 - 何时使用已检查和未检查的异常以及为什么,为什么要或不想捕获异常等等。当考虑调用其他库,调用Java库时,这更加复杂,您甚至可能希望对未经检查的异常执行某些操作。 (例如,Java的Number类中的解析方法抛出了几乎肯定想要捕获的未经检查的异常。)

我总是会从某个地方的GUI线程中捕获甚至未经检查的异常,因为显示一个有用的对话框比在控制台上显示异常更加用户友好。例外情况适用于开发人员,而非用户。在Java中,有一种特殊的机制可以让你捕获所有的GUI异常,并在它们到达控制台之前对它们做一些有建设性的事情。您可以调用Thread.setDefaultUncheckedExceptionHandler()来设置处理所有线程中未经检查的异常的默认方法,并调用System.setProperty("sun.awt.exception.handler", "string-that-names-exception-handler-class")以便系统将异常传递给您选择的类。据我所知,这两个类的实现需要实现Thread.UncaughtExceptionHandler

编辑:感谢AKF和其他人,他们确实去了stderr。问题是启动GUI应用程序的典型方法不涉及将stderr重定向到文件; stderr和stdout刚被丢弃。我强烈建议使用某种日志记录工具然后记录,不仅是异常,还有代码中发生的其他有趣的事情。例如,我为我的一些研究代码设置了一个原始的日志记录工具,以便它在启动某些算法代码时会记录,需要多长时间,它在哪个实验案例上等等。但是对于生产代码我可能想要花时间学习和使用真正的日志记录工具,例如log4j,java.util.logging,或者其他人正在使用的其他任何东西。

答案 1 :(得分:2)

正如其他人所提到的,未经检查的异常将转到stderr,当没有控制台时,这将无处可去。最好的办法是install a new default exception handler,然后记录异常或向用户显示错误消息。注意,异常处理程序可以安装在所有线程上,或安装在特定线程上,例如UI线程。

答案 2 :(得分:1)

如果它们被抛出,通常会转到stdout,如果控制台或管道不存在,操作系统会忽略它。

答案 3 :(得分:1)

这些未经检查的异常仍将写入stderr。因此,将stderr(和stdout)重定向到文件很有用。

答案 4 :(得分:0)

在OS X上,GUI应用程序中的错误消息将附加到系统日志中,可在控制台应用程序中查看。我不知道这是否特别针对Java应用程序中的异常发生,但我想是这样,如果你有任何一个,很容易测试。

我不了解其他操作系统。

我同意其他海报,你应该自己将它们重定向到一个文件。