由于不需要尝试/捕获或指定未经检查的异常,它们如何报告给用户?
答案 0 :(得分:3)
如何向用户报告? 什么是最好的处理方法 未经检查的例外?
在我们的应用程序中,我们几乎不使用任何异常:既未检查也未取消检查(我们认为已检查的异常是与我们正在处理的问题域无关的Java idiosynchrasy,因此我们将大多数已检查的异常包含在更清晰的API中,使用状态测试方法)。
我们处理它的方式很简单:它是一个桌面应用程序,如果我们捕获未捕获的异常,我们会向用户提供向我们发送报告的可能性。用户所要做的只是点击“报告”,我们将完整的堆栈跟踪和其他信息发送到我们的服务器。
您可以设置一个应用程序范围的未捕获异常处理程序,如下所示:
Thread.setDefaultUncaughtExceptionHandler( new Thread.UncaughtExceptionHandler() {
public void uncaughtException( final Thread t, final Throwable e ) {
...
// Here we offer our user the possibility to 'report' the exception, YMMV
}
}
通常在我们的软件中发生零异常:我们不使用检查异常进行流控制(除非我们使用来自九十年代的脑死亡API,这是常见做法)。
一些框架,如Spring,也非常偏向“没有检查过的例外”心态。
因此我们的例外真的例外,因此弹出窗口警告用户应用程序崩溃并向他们提供向我们发送报告的可能性。
答案 1 :(得分:2)
如果您正在编写容器或框架或UI框架,那么处理它们的最佳位置是集中处理,将它们一直传播到中央处理程序并以可用的方式向用户报告错误, 如果使用UI,请为用户提供报告该异常的方法。
详细说明:
我们通常在使用UI时使用具有中央异常处理程序的做法。 在Web UI的情况下,我们在处理程序上向用户显示系统中出现了问题,错误页面还有一个隐藏字段的表单,其中包含堆栈跟踪以及描述(可选)字段,要求用户描述发生错误时她/他在做什么。 for提交错误信息,堆栈跟踪到系统(可以是邮件或只是存储在db中) 在桌面用户界面中,可能是相同的,唯一不同的是放置异常处理代码的地方。
Error reporting example http://www.flickr.com/photos/aniketn/4785197367/
答案 2 :(得分:1)
您实际上可以捕获未经检查的异常。只是当你抓住它们时,它们通常是你无法解决的事情 - 例如,NullPointerException
。当NullPointerException
发生时,通常无法顺利和优雅地恢复您正在做的任何事情。
如果你不处理它们,它们会在程序中一直向上传播,它将中止,转储异常的堆栈跟踪。
最佳做法是处理可以提供比默认值更好的处理方式。例如,如果您调用外部库函数,则可以将其包装在try / catch块中,如果库抛出NullPointerException
,您可以向用户提供友好错误消息(a GUI“库X未能执行Y - 您是否指定了有效的Z?”而不是命令行上的堆栈跟踪。但是在一般情况下,他们没有受到控制的原因是因为即使你知道他们,也没有什么可以做但只是举手。
答案 3 :(得分:0)
当冒出main(...)方法时,JVM将堆栈跟踪打印到System.out并退出该线程。对于单线程程序,这也会退出程序。
通常,您运行的每个线程都应该有一个包装器来捕获Throwable,这样您至少可以将它记录到您的文件中。