是否可以获取可以通过方法抛出的具体异常的列表(和捕获)?
我正在调用使用异常层次结构的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();
}
}
}
我希望能够尽可能地创建以下尝试/捕获,然后再调整:
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
}
}
}
答案是:no。
该方法声明其投掷。如果仅宣布顶级异常(即示例中的Exception
)...那么,这就是您所有的IDE都知道/告诉您要抓住。
要找到可能抛出的每个子类,您必须查看Javadocs和/或代码以找到您感兴趣的子类或特定的子类。
最终,如果您使用的是抛出异常超级类的API,并且有一些原因您需要知道混凝土子类...这是一个设计良好的API。写API时抛出超类的目的是,无论哪个子类真正被抛出,都只有一条逻辑可以处理。
您也可以执行此操作。
try{
interface.doShakyStuff();
}catch(Exception e){
if(e instanceof IOException){
}
if( e instanceof IllegalAccessException ){
}
if( e instanceof InterruptedException ){
}
}