实际上,如果您没有任何恢复策略,则不应该处理已检查的异常。
您是否有其他架构以防您使用的架构引发 Sax 异常?
如果您使用的验证器引发 IO 异常,您是否有另一个验证器?
这些异常还有其他可能的恢复方式吗?
如果不这样做,您可能应该将该异常包装在运行时(未经检查的)异常中,然后将其抛出到顶层(将被捕获的地方)。最后,如果需要了解问题,您可以在包装类中添加额外的消息。
除非你的程序可以在没有这个 sax 模式的情况下正常工作(在这种情况下你会捕获异常,也能够捕获运行时异常),或者你的程序有恢复策略,否则你不应该在不重新抛出的情况下捕获异常它。
如果你的恢复策略失败,你也可以将恢复异常包装成未经检查的异常,让顶层处理(log + error 500 或类似的东西)。
这就是快速失败的原则。
请注意,在 Java 中,多年来一直存在关于已检查与未检查异常的大争议。许多对 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
异常类是所有异常的超类
普通程序不妨从中恢复。
Bruce Eckel(《Java 思维》一书):
http://www.mindview.net/Etc/Discussions/CheckedExceptions
上一段中的“可忽略”是另一个问题。理论
是如果编译器强制程序员要么处理
异常或在异常规范中传递它,然后
程序员的注意力总会被带回到可能性上
错误,他们将因此妥善处理它们。我觉得
问题是这是我们所做的未经检验的假设
属于心理学领域的语言设计师。我的理论
是当有人试图做某事而你不断
用烦恼刺激他们,他们会使用最快的设备
可以让这些烦恼消失,这样他们就可以得到他们的东西
完成,也许假设他们稍后会回去取出设备。
我发现我已经在 Thinking in Java 的第一版中做到了这一点:
...
} catch (SomeKindOfException e) {}