繁体   English   中英

Java:捕获特定异常

[英]Java: catching specific Exceptions

说我有以下几点

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

当遇到 SpecificException 时会发生什么? 它是否首先将其作为通用异常捕获,然后再捕获特定异常?

或者它是否只捕获特定异常而忽略一般异常。

我不希望通用和特定异常都被捕获。

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

您必须首先拥有更具体的异常 catch 块,然后才是通用的。

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

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

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

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

这不能用 eclipse 编译器编译:

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

所以用另一种方式定义它们。 只有特定的会被捕获。

依次尝试 catch 块,并执行第一个匹配异常类型的块。 由于Exception是所有异常类型的超类,所以会一直在这个实例中执行,特定情况下永远不会执行。 事实上,编译器足够聪明,可以注意到这一点并引发编译错误。

只需重新排序 catch 子句。

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

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

我的提议 - 捕获 SQLException 并检查代码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM