如何在java方法中处理多个异常?

时间:2015-05-08 00:27:22

标签: java exception

我已经阅读过这样的多种异常并非最佳做法:

public void myMethod() throws ExceptionA, ExceptionB, ExceptionC {
    //more code here
}

然后调用myMethod():

try {
    myObject.myMethod();
} catch(Exception e) {
    //More code here
}

尽管Exception是所有其他异常的父类,但它被认为是一种不好的做法。但是,在我的应用程序中,我使用的是Java SE 6,我需要:

  • 执行可能暗示FileNotFOundException和IOException的文件操作
  • Marshal对象(为了创建XML文件)JAXBException
  • 创建pdf文件(使用pdfbox库)COSVisitorException
  • 使用JavaMail发送电子邮件,MessagingException

最简单的方法是在方法声明中添加throws语句,但是编写客户端方法的正确方法是什么?

是否可以添加6个或7个catch块来处理所有可能的异常?

1 个答案:

答案 0 :(得分:2)

一般来说(对于Java 6及以下版本),您应该单独处理每个异常......

try {
    myObject.myMethod();
} catch (ExceptionA e) {
    // Condition for A
} catch (ExceptionB e) {
    // Condition for B
} catch (ExceptionC e) {
    // Condition for C
}

这允许您根据它们的不同来处理每个异常,但也意味着您只处理报告由方法抛出的异常

在Java 7+中,您可以使用" multi-catch"或"合并捕获" (我们无法找到"官方"术语)

try {
    myObject.myMethod();
} catch (ExceptionA | ExceptionB | ExceptionC e) {
    // Condition for A and B and C
}

但即便如此,你应该把例外重点放在"普通"使用组

try {
    myObject.myMethod();
} catch (ExceptionA | ExceptionB e) {
    // Condition for A and B
} catch (ExceptionC e) {
    // Condition for C
}

另一个选项,如果你控制如何定义异常,就是从一个公共基础异常扩展,一个很好的例子是FileNotFoundException,它从IOException延伸,由FileReader引发FileInputStreamFileNotFoundException(作为示例),这意味着您可以根据需要处理IOException作为公共FileReader fr = null; try { fr = new FileReader(new File(...)); // Read from reader... } catch (IOException exp) { // Common catch block } finally { // Best attempt to close try { fr.close(); } catch (Exception exp) { } } ...

FileNotFoundException

或者您可以根据自己的情况处理FileReader fr = null; try { fr = new FileReader(new File(...)); // Read from reader... } catch (FileNotFoundException exp) { // File not found condition } catch (IOException exp) { // Other IO condition } finally { // Best attempt to close try { if (fr != null) { fr.close(); } } catch (Exception exp) { } } ...

IOException

这允许你分组"喜欢"例外情况,但也可以为您提供控制,以便在您需要时定义更细粒度的条件...

请注意,我们上面的示例,如果我先放FileNotFoundException} catch (IOException exp) { if (exp instanceof FileNotFound || exp instanceof FileSystemException) { // Common handling } else { // Generic handling } } 将永远不会被处理,执行此操作时,请确保先使用最低/最严/最好的异常,因为它们按照您列出的顺序按顺序处理

另一种选择(我并不热衷于,但已经看过)可能是为了抓住一个常见的"祖先然后比较实际类型,这将允许您为异常的某些子类型提供常用处理程序。

IOException

这可能在方法仅抛出祖先类型(即Throwable)的情况下有用,但您需要提供更精细的分辨率

但是,再一次,我会专注于只处理预期的"普通"声明被抛出的例外情况,例如

,不要去追捕MACRO(foo, postfix, ...) ----> foo_postfix(__VA_ARGS__)