我最近一直在阅读很多有关例外的帖子,我有一个问题是应该抓住未经检查的例外情况。我已经读过,如果您希望应用程序从错误中恢复,请使用已检查的异常。但是,如果您无法处理已检查的异常,则将其包装到另一个已检查的异常中,以便将其传递给另一个层;例如,您包装SqlException
,或者抛出未经检查的异常。但是,你应该捕获未经检查的异常吗?未经检查的异常是理想情况下您不检查的编程错误吗?它们应该从您的应用程序中冒出来吗?
答案 0 :(得分:9)
是否应该检查并处理未经检查的异常?
答案是,它取决于:
这取决于例外情况。
这取决于抛出异常的原因。是“预期”吗?是由于错误,输入错误还是环境问题?或其他什么?
这取决于是否有一种好方法可以恢复。这通常部分取决于以前的标准。
如果异常是意外的,那么异常的原因是不确定的,并且/或者如果你确实捕获了异常,如果没有声音恢复策略,那么通常最好允许异常冒泡,并确保它被报告/记录在顶层。
如果异常是Error
,则一般规则是您不应尝试恢复。其中包括StackOverflowError
和(特别是)OutOfMemoryError
。 Error
例外表示难以(或不可能)安全恢复的问题,最佳策略是允许或导致应用程序退出。
在顶级报道/记录是什么意思?你的意思是在UI层捕获它并显示一个对话框,记录它等等吗?
我的意思是应该将异常及其堆栈跟踪写入应用程序的日志文件,以便维护人员可以查看问题的证据。您是否也尝试向最终用户解释问题(以及您如何做到这一点)是一个单独的问题。
“顶级”可以是“主”方法,子线程或runnable的“run”方法......或未捕获的异常处理程序。基本上,如果它没有被捕获,那么异常最终将“冒泡”到哪里。详细信息取决于您的应用程序架构。
答案 1 :(得分:5)
如果您能够以有意义的方式处理问题,那么您应该捕获异常(已选中或未选中)。如果你没有一个好的方法来处理它,你通常应该不捕获异常。
我看到太多的代码通过执行e.printStackTrace()
来“处理”异常,然后继续,好像什么都没有错。忽略这样的问题通常会在以后导致其他问题。
答案 2 :(得分:4)
没有什么可以阻止你捕获运行时异常。
如今,趋势是使用越来越多的运行时异常,并且检查的异常越来越少。 Spring,Hibernate和最新的Java EE规范几乎完全使用运行时异常。这使得业务代码更易于阅读且不那么繁琐。
运行时异常通常不会被捕获,或者仅在UI层中的调用堆栈底部被捕获,以便显示错误消息,因为这通常是您可以做的唯一事情。发生这样的例外。
答案 3 :(得分:1)
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
是您无法恢复的。{/ p>
有关详细信息,请参阅以下链接: -
答案 4 :(得分:1)
选中已检查的例外通常是:如果您无法对其进行任何操作,只需将其添加到throws
,catch
并将其转换为新的例外情况,如果您可以将原始文件作为原因做任何有用的事情,但可以添加信息,并catch
如果它可行,并在代码中正确的地方做一些事情,就可以做一些事情。
未经检查的异常有点棘手。在理想世界中,它们应该指出编程/逻辑错误,并且处理非常类似于断言失败,没有捕获,特别是不被吞没。
在我看来,来自Java标准库或其他库的一些未经检查的异常应该检查异常,但不是。在这些情况下,调用者应该承认这些异常可能会通过它们,即使它们没有catch
。对于未经检查的异常,可以检查异常,基本上是相同的规则:如果你想对它们做些什么,请抓住它们,否则让它们冒泡。如果你正在创建一个库(即使它只是一个应用程序的内部),并且一个未经检查的异常确实应该在以后捕获,那么你可能想要捕获并重新将它包装到库代码中的一个已检查的异常中
通常,尽量避免抛出未经检查的异常。检查输入,因此您不需要catch
,如果仍然抛出异常,那么这是一个错误,应该保持未被捕获状态。如果它是唯一的或至少是明确最好的方式,则只有catch
。
为了公平对待Java库,这个语言是在那个时代设计的,当IDE还没有立即抱怨丢失抛出条款并提出自动填充它们时,所以通过减少负担可以证明它们未经检查是合理的。开发商。但是使用现代工具,真的没有任何借口。
然后,正如其他答案中所提到的那样,你应该不捕获未经检查的例外。
答案 5 :(得分:-1)
你应该捕获未经检查的例外吗?
是和否取决于抛出的异常。
未经检查的异常是理想情况下您不检查的编程错误吗?
您可以编写catch
块来捕获未经检查的例外,但又取决于您是否。如果你这样做,那么很可能一个bug在很长一段时间内仍未解决,当它被发现时,它的大小也会发生变化。
它们应该从您的应用程序中冒出来吗?
如果它们发生,请尝试解决它们的原因(如果可能的话)。不要catch
他们总是作为艰难和快速的规则。