是否可以获取方法可以抛出的具体异常的列表(并捕获)?
我正在调用使用异常层次结构的API,但只声明方法的顶级异常。我希望能够根据异常提供特定的行为,但我不想跟踪代码以找到可能抛出的具体异常。
可能会增加复杂性,API包含多个由接口分隔的层。
简单示例:
public interface MyInterface {
void doShakyStuff() throws Exception;
}
public class MyImpl implements MyInterface {
public void doShakyStuff() throws Exception{
double rand = Math.random();
if( rand > 0.1 ){
throw new IOException();
}
if( rand > 0.5 ){
throw new IllegalAccessException();
}
else{
throw new InterruptedException();
}
}
}
我希望能够尽可能完整地创建以下try / catch,然后再进行调整:
public class MyClass{
private MyInterface interface;
public void doStuff(){
try{
interface.doShakyStuff();
}catch(IOException e){
// ...
} catch( IllegalAccessException e){
// ...
} catch( InterruptedException e){
// ...
} catch(Exception e){
// something else
}
}
}
答案 0 :(得分:2)
答案是:不。
该方法声明它抛出的内容。如果它只是声明一个顶级异常(例如你的例子中的Exception
)......那么那就是你所知道的所有IDE都会知道/告诉你要抓住它。
要查找它可能抛出的每个子类,您必须查看javadoc和/或代码以查找您感兴趣的抛出的子类或特定子类。
最终如果你正在使用一个抛出异常超类的API,并且有一些原因你需要知道具体的子类...它是一个设计糟糕的API。在编写API时抛出超类的意义在于,无论实际抛出哪个子类,都只需要一行逻辑来处理它。
答案 1 :(得分:1)
你也可以这样做。
try{
interface.doShakyStuff();
}catch(Exception e){
if(e instanceof IOException){
}
if( e instanceof IllegalAccessException ){
}
if( e instanceof InterruptedException ){
}
}