我最近一直念叨例外很多帖子,我有一个问题unchecked异常是否应该被抓。 我已阅读,如果你希望你的应用程序从您使用checked异常的错误中恢复。 但是,如果你不能与检查的异常处理你要么把它包装成另一种检查型异常,所以你可以将它传递到另一个层; 比如你换一个SqlException
,或者你抛出一个未经检查的异常。 然而,你应该抓住unchecked异常? 被unchecked异常理想的编程,你不检查错误? 应该从你的应用程序,他们只是泡了?
Answer 1:
应该unchecked异常进行捕获和处理?
答案是,这取决于:
这取决于异常是什么。
这取决于为什么抛出异常。 是不是“预期”? 这是由于一个错误,或者错误的输入,或环境问题? 或者是其他东西?
这取决于是否有恢复的好方法。 通常部分取决于以前的标准。
如果异常是意外的,异常的原因是不确定的,和/或是否存在,如果你捕获该异常没有声音恢复策略,那么它一般都比较好,允许例外冒泡,并确保它得到报道/记录在顶层。
而如果异常是一个Error
,一般的规则是,你不应该试图恢复。 和包括StackOverflowError
和(特别是) OutOfMemoryError
。 该Error
例外表明一个问题,即很难(甚至不可能)安全地从复原,最好的策略是允许或导致应用程序退出。
你是什么意思的报道/记录在顶层? 你的意思是在例如UI层捕获它,并显示一个对话框,它记录等?
我的意思是例外,它的堆栈跟踪应写入应用程序的日志文件,以便在问题的证据可用于维护者看。 无论您也尽量说明问题向最终用户(以及你如何做到这一点)是另外一个问题。
“顶级”可能是“主”的方法,一个子线程或可运行的“运行”的方法......或者未捕获的异常处理程序。 基本上,无论是异常最终将“冒泡”到如果不抓住它。 详细情况将取决于您的应用程序的体系结构。
Answer 2:
你应该捕捉异常 - 选中或取消选中 - 如果你能在从问题中恢复有意义的方式处理它。 你通常如果你没有处理的好方法不应该捕捉异常。
我见过太多的代码,通过做“处理”异常e.printStackTrace()
然后继续仿佛什么是错的。 忽略这样一个问题通常只是导致其他问题以后。
Answer 3:
没有禁止你捕捉运行时异常。
这一趋势,如今,是使用越来越多的运行时异常,并且越来越少检查的异常。 春天,Hibernate和最新的Java EE规范使用运行时异常几乎完全。 这使得业务代码更易于阅读和不太繁琐。
运行时异常通常旨在在全部没有被捕获,或者只抓到调用堆栈的底部,在UI层,以显示错误消息,因为这通常是你可以做的,当这样的异常的唯一的事情发生。
Answer 4:
之间的根本区别Checked
和Unchecked
的例外是,你需要明确地处理前或在传播它inheritance hierarchy
,而这是不需要的版本。
此外, CheckedException
从延伸java.lang.Exception
,而UncheckedExceptions
从延伸java.lang.RuntimeException
,其不需要进行处理。 需要注意的是, RuntimeException
是自己的子类Exception
。
鉴于所有上述信息,如果你handle
一个unchecked exception
,然后它的罚款。 它会正常工作,而控制将转到相应的catch
块。 但是,你不应该这样做。 除非,你真的需要它,你必须处理它们取之有道。
对于如: -你应该处理一个
IllegalArgumentException
这是一个Unchecked Exception
。然后,你不应该处理这样的错误: -
StackOverflowError
。 至于,你不知道为什么这个问题会发生,什么可能是处理它的适当方式。 所以,就交给了JVM。Errors
是Unchecked Exception
,你不能歇着。
有关详细信息,请参考以下链接: -
- http://tutorials.jenkov.com/java-exception-handling/checked-or-unchecked-exceptions.html
- http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html
Answer 5:
首选检查异常通常是:你只需要添加它throws
,如果你不能做任何事情, catch
并将其与原转换成新的异常,如果你不能做任何有用的这件事,但是可以添加信息的原因,和catch
它,做一些事情,如果它是可行的,并在你的代码正确的地方做一些事情。
unchecked异常是比较麻烦一些。 在理想世界中,应注明编程/逻辑错误,并非常像处理断言失败,没有抓到,尤其是不能吞噬。
一些未经检查的异常从Java标准库或其他图书馆未来应该在我看来,真正被检查异常,但并非如此。 这些情况下,如果主叫方应该承认,这种异常可通过他们,即使他们没有catch
他们。 对于可能也被检查异常,基本相同的规则unchecked异常:抓住他们,如果你想要做的事他们,否则让他们泡了。 如果你是一个库(即使它只是内部的应用程序),以及一个未经检查的异常真的是一些东西,应该以后被捉住,那么你可能想赶上并重新把它裹进库中的代码检查异常。
在一般情况下,尽量避免抛出unchecked异常。 检查输入,所以你并不需要catch
,如果异常仍抛出,那么它是一个错误,并应留有未捕获。 只有catch
他们,如果它是唯一的,或者至少显然是最好的方式。
为了公平对待Java库,语言被设计在了时代,集成开发环境还不马上抱怨缺少抛出条款,并提供,以填补他们在自动,这样使得他们选中可能已经通过减少开发商的负担合理的。 但随着现代化的工具,真的没有借口。
然后,在其他的答案中提到,有你不应该赶上unchecked异常。
Answer 6:
你应该抓住unchecked异常?
Yes和No.取决于被抛出什么异常。
被unchecked异常理想的编程,你不检查错误?
你可以写一个catch
块捕获未经检查的异常,但也取决于你是否应该 。 如果你这样做,然后它可能是一个错误仍未得到解决了很长一段时间,并通过时间才发现它的大小也发生了变化。
应该从你的应用程序,他们只是泡了?
如果他们出现,尽量解决他们的原因(如果它spossible)。 不要catch
总是他们作为硬性规定。