实际上,如果您没有任何恢复策略,则不应该处理已检查的异常。
如果您使用的架构引发 Sax 异常,您是否还有其他架构?如果您使用的验证器引发 IO 异常,您是否有另一个验证器?这些异常还有其他可能的恢复吗?
如果不这样做,您可能应该将该异常包装在运行时(未经检查的)异常中,并让它被抛出到顶层(它将被捕获)。最后,如果需要了解问题,您可以在包装类中添加额外的消息。
除非您的程序可以在没有此 sax 模式的情况下正常工作(在这种情况下,您将捕获异常,也能够捕获运行时异常),或者您的程序具有恢复策略,否则您不应该在不重新抛出异常的情况下捕获异常。
如果您的恢复策略失败,您还可以将恢复异常包装到未经检查的异常中,让顶层处理它(log + error 500 或类似的东西)。
这就是快速失败的原则。
请注意,在 Java 中,多年来一直存在关于已检查 VS 未检查异常的大争议。许多对 Java 有影响的人真的认为引入检查异常是一个错误。
主要原因是:
人们很懒惰,往往会在错误的地方捕捉到异常,这样他们就不会再被打扰了。
人们不遵循 sun 的建议:他们抛出检查异常只是为了在编译时为 API 的客户端“发出警告”。
人们倾向于认为只有声明检查异常的方法才能引发异常,而任何代码/方法都可以引发异常。只有当编译器这么说时,您才应该捕获异常:您必须考虑在哪里捕获它是合适的。
有点同意布鲁斯·埃克尔的观点:
我认为问题在于,这是我们作为语言设计者所做的未经检验的假设,属于心理学领域。
您可以找到许多关于该主题的链接。很多java开发者并没有意识到这一点,而且现在很多成熟的框架主要使用unchecked exceptions(Spring、EJB3...)。
做 C#(没有检查异常)和 Java 的人也倾向于认为没有检查异常会更好。
所以你可以这样做:
try {
your code here
} catch (Exception e) {
throw new RuntimeException("optionnal message",e);
}
如果您认为它有用,您最终可以使用自定义运行时异常
太阳资源:
http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html
这是底线准则:如果可以合理地期望客户端从异常中恢复,则将其设为已检查异常。如果客户端无法从异常中恢复,请将其设为未经检查的异常。
http://docs.oracle.com/javase/specs/jls/se5.0/html/exceptions.html#11.5
Exception 类是普通程序可能希望从中恢复的所有异常的超类。
Bruce Eckel (Thinking in Java book):
http: //www.mindview.net/Etc/Discussions/CheckedExceptions
上一段中的“可忽略”是另一个问题。理论是,如果编译器强制程序员要么处理异常,要么在异常规范中传递它,那么程序员的注意力总是会回到错误的可能性上,因此他们会妥善处理它们。我认为问题在于,这是我们作为语言设计者所做的未经检验的假设,属于心理学领域。我的理论是,当有人试图做某事而你不断地用烦恼来刺激他们时,他们会使用最快的设备来消除这些烦恼,这样他们就可以完成他们的事情,也许假设他们会回去拿稍后取出设备。
...
} catch (SomeKindOfException e) {}