2

我正在针对 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?

4

3 回答 3

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
}
于 2011-11-26T15:23:23.470 回答
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 {
    //...
于 2011-11-26T15:53:25.540 回答
0

实际上,如果您没有任何恢复策略,则不应该处理已检查的异常。

如果您使用的架构引发 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) {}

于 2011-11-26T17:16:58.697 回答