我正在针对xsd验证xml,我发现有很多情况需要处理异常。
我相信这些在java中被称为检查异常吗?
SchemaFactory sf = ....
Schema schema = sf.newSchema(...) // SAXException has to be handled
Validator validator = ...
validator.validate(xmlFile); // IOException has to be handled again
我应该如何编写此代码块?
我是否在try / catch中使用try / catch?
答案 0 :(得分:2)
try {
SchemaFactory sf = ....
Schema schema = sf.newSchema(...) // SAXException has to be handled
Validator validator = ...
validator.validate(xmlFile); // IOException has to be handled again
} catch (SAXException e) {
// handle SAX error
} catch (IOException e) {
// handle IO error
}
答案 1 :(得分:0)
我是否在try / catch中使用try / catch?
try {
//...
} catch(SAXException e) {
//handle SAXException
} catch(IOException e) {
//handle IOException
}
我认为代码看起来比使用嵌套的try / catch更干净。
我该如何编写此代码块?
这取决于你是否需要在那里处理异常,在这种情况下你使用try/catch
,或者如果需要调用者来处理异常,在这种情况下你应该通过使用它来传播给调用者throws
条款。
public void validateXml() throws SAXException, IOException {
//...
答案 2 :(得分:0)
实际上,如果您没有任何恢复策略,则不应该处理已检查的异常。
你有另一个架构,以防你使用的架构引发Sax例外吗? 如果您使用的那个引发IO异常,您是否有另一个验证器? 这些例外可能还有其他可能的恢复吗?
如果不这样做,您应该将该异常包装在Runtime(未经检查)异常中,并将其抛出到顶层(将被捕获的位置)。最终,如果需要了解问题,您可以在包装类中添加额外的消息。
除非你的程序在没有这个sax模式的情况下才能正常工作(在这种情况下你会捕获异常,也能捕获运行时异常),或者你的程序有一个恢复策略,你不应该在没有重新抛出的情况下捕获异常它
如果恢复策略失败,您还可以将恢复异常包装到未经检查的异常中,让顶层处理它(log + error 500或类似的东西)。
这是快速失败的原则。
请注意,在Java中,关于已检查的VS未经检查的异常,存在很多争议。 Java中的许多流入人员确实认为引入已检查的异常是一个错误。
主要原因是:
人们很懒,往往会在错误的地方发现异常,这样他们就不会再烦恼了。
人们不遵循sun建议:他们抛出已检查的异常只是为了在编译时为API的客户端“发出警告”。
人们倾向于认为只有声明已检查异常的方法才会引发异常,而任何代码/方法都会抛出异常。只有当编制者说出来时,你才不应该抓住例外:你必须认为它适合捕捉它。
有点同意布鲁斯·埃克尔:
我认为问题在于,这是一个未经测试的假设 作为落入心理学领域的语言设计师。
您可以找到有关该主题的许多链接。许多java开发人员都没有意识到这一点,但是现在许多成熟的框架主要使用未经检查的异常(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(思考Java书): http://www.mindview.net/Etc/Discussions/CheckedExceptions
前一段中的“可忽略”是另一个问题。理论 如果编译器强制程序员要么处理 异常或在异常规范中传递它,然后是 程序员的注意力将永远带回到可能性 因此,他们会妥善照顾他们。我觉得 问题是,这是我们正在制作的未经测试的假设 落入心理学领域的语言设计师。我的理论 当有人试图做某事而你却经常这样做时 他们会烦恼地刺激他们,他们将使用最快的设备 可以让那些烦恼消失,这样他们就能得到他们的东西 完成,或许假设他们会回去并稍后取出设备。 我发现我在第一版Thinking in Java中已经做到了这一点:
... } catch (SomeKindOfException e) {}