Java:捕获特定的异常

时间:2010-12-30 21:36:51

标签: java

说我有以下

try{
//something
}catch(Exception generic){
//catch all
}catch(SpecificException se){
//catch specific exception only
}

遇到SpecificException会发生什么?它首先将它作为一般异常捕获,然后捕获特定的异常吗?

或者它只捕获SpecificException而忽略一般异常。

我不希望捕获泛型和特定感知。

6 个答案:

答案 0 :(得分:23)

这不会编译。您将被告知无法访问特定的异常块。

首先必须使用更具体的异常catch块,然后是常规异常。

try
{
    //something
} 
catch(SpecificException se)
{
    //catch specific exception only
}
catch(Exception generic)
{
    //catch all
}

答案 1 :(得分:11)

没有。所有异常都将被第一个块捕获。永远不会达到第二个(编译器识别,导致由于无法访问的代码而导致错误)。如果你想特别对待SpecificException,你必须反过来这样做:

}catch(SpecificException se){
//catch specific exception only
}catch(Exception generic){
//catch all
}

然后SpecificException将被第一个区块捕获,而所有其他区域将被第二个区块捕获。

答案 2 :(得分:6)

这不能用eclipse编译器编译:

  

IOException的无法访问的catch块。它已由异常的catch块处理

所以用另一种方式定义它们。只会抓住特定的一个。

答案 3 :(得分:4)

按顺序尝试catch块,并执行与该异常类型匹配的第一个块。由于Exception是所有异常类型的超类,因此它将始终在此实例中执行,并且永远不会执行特定的情况。事实上,编译器足够聪明,可以注意到这一点并引发编译错误。

只需重新排序catch子句。

答案 4 :(得分:2)

作为旁注,调用两个catch块的唯一方法是使用嵌套异常。

try {
  try{
  //something
  }catch(SpecificException se){
  //catch specific exception only
  throw se;
  }
}catch(Exception generic){
//catch all
}

答案 5 :(得分:0)

我的主张-捕获SQLException并检查代码。

try {
    getConnectionSYS(dbConfigFile, properties);
} catch (SQLException e){
    if (e.getErrorCode()==1017){
        getConnectionUSER(dbConfigFile, properties);
    } else {
        throw e;
    }
}