说我有以下
try{
//something
}catch(Exception generic){
//catch all
}catch(SpecificException se){
//catch specific exception only
}
遇到SpecificException会发生什么?它首先将它作为一般异常捕获,然后捕获特定的异常吗?
或者它只捕获SpecificException而忽略一般异常。
我不希望捕获泛型和特定感知。
答案 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;
}
}