就像这样的Java代码片段:
public void func() throws XXXException { // throw exception to outer body ------ (2)
try {
......
} catch(XXXException ex) {
// handle exception ------ (1)
}
}
在这种情况下,您如何决定选择(1)还是(2)? Java异常处理中是否有任何原则?
答案 0 :(得分:2)
如果调用抛出异常的方法的代码可以正确处理异常,那么它应该捕获它。如果它无法处理异常,则应将其抛弃。
例如,如果“func”是低级网络代码,它应该抛出异常而不是捕获它。最终捕获它的代码应该向用户显示错误消息(或其他任何有意义的消息)。如果“func”是GUI层的一部分,它可能会捕获异常并向用户显示错误消息(或其他任何有意义的消息)。
答案 1 :(得分:1)
如果你能处理它,你就可以处理它。例如,如果要加载属性文件并获得FileNotFoundException
,则可能使用某些默认属性。在这种情况下,您处理异常。
如果你无法处理它,但你认为其他人可能会在路上,那么你应该抛出异常。例如,您可能正在编写用于读取属性文件的通用实用程序。在这种情况下,您可能会重新抛出异常,以便使用常规实用程序的任何人都可以继续并加载默认值。
如果您无法处理它并且您不想引入抛出异常的复杂性,那么您应该将异常发送到您可以在运行时配置的异常处理服务。这种方式,当单元测试异常处理服务时可以获取该异常并将其重新抛出为运行时异常,这将立即使测试崩溃。但是,在生产代码中,异常处理服务可能只记录异常并尝试以某种方式重新启动程序。
答案 2 :(得分:0)
如果您想对异常做一些事情(例如记录它,从中提取信息),您选择(1)。完成后,在catch块中抛出异常也很常见(即throw ex;
)
如果您希望方法的用户处理它(例如Java's String.matches method)
,请选择(2)答案 3 :(得分:0)
在坚果壳中,选择向外体抛出异常,除非你有特殊的理由去捕捉异常。
答案 4 :(得分:0)
在O'Reilly java网站上有关于此主题的优秀article。它会详细介绍何时应该捕获与抛出以及其他内容,例如已检查与未检查的异常。
答案 5 :(得分:0)
例外表示错误情况。当出现错误情况时,调用链中的某些方法知道如何在应用程序的上下文中处理错误 即做什么 - 忽略,重试,中止等如果这是那个知道如何处理这个异常的方法,那么你在这里处理它。如果没有,则抛出它,以便调用链上一级的方法接收它并对其起作用。
有时,您可能想要同时执行(1)和(2)。您可以处理异常,进行一些中间处理,然后重新抛出它。
public void func() throws XXXException {
try {
......
} catch(XXXException ex) {
logger.log(ex);
throw ex;
}
}
或者您可以捕获一个异常并抛出另一个异常,例如当您想将第三方异常包装到应用程序异常中时。
public void func() throws YYYException {
try {
......
} catch(XXXException ex) {
throw new YYYException(ex);
}
}
在这两种情况下,这不是完全处理异常的方法,只是沿着进行一些处理,因为异常渗透到顶层。