我已经阅读过这样的多种异常并非最佳做法:
public void myMethod() throws ExceptionA, ExceptionB, ExceptionC {
//more code here
}
然后调用myMethod():
try {
myObject.myMethod();
} catch(Exception e) {
//More code here
}
尽管Exception是所有其他异常的父类,但它被认为是一种不好的做法。但是,在我的应用程序中,我使用的是Java SE 6,我需要:
最简单的方法是在方法声明中添加throws语句,但是编写客户端方法的正确方法是什么?
是否可以添加6个或7个catch块来处理所有可能的异常?
答案 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
引发FileInputStream
和FileNotFoundException
(作为示例),这意味着您可以根据需要处理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__)