Java异常和内部异常,我这样做是否正确?

时间:2011-11-26 15:07:48

标签: java xml exception checked-exceptions

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

3 个答案:

答案 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?

IMO,没有。

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) {}