哪个更适合异常处理?

时间:2014-04-03 08:15:22

标签: java exception-handling

我们有5种可能的例外,我们想要处理它们。我应该使用5种不同的捕获物 那样:

try {
  //...
}
catch(Exception e) {
 if(e instanceof IOException) 
 else if(e instanceof IllegalStateException)
}

谢谢。

7 个答案:

答案 0 :(得分:8)

使用5个不同的catch块肯定比使用instanceof运算符模拟相同的东西更好。只需保持顺序正确(首先是最具体的例外,然后是最后的一般例外):

try {

} catch (IOException exc) { 
    // do something
} catch (IllegalStateException exc) {
    // do something else
} catch (Exception exc) {
    // do something else for all remaining exceptions.
}

此外,如果您对某些例外有类似处理,并且您已经使用Java 7,则可以利用多捕获块:

try {

} catch (IOException | IllegalStateException exc) { 
    // do something
}

答案 1 :(得分:2)

如果您抓住Exception,然后有if-else if的级联,则会冒吞咽任何不匹配的异常的风险。编译器不会强制执行结束else throw e子句。

此外,一旦你将其作为Exception抓住,如果你的方法没有声明throws Exception,那么你甚至不能再把它扔掉,这是不应该的。

总而言之,除非:

,否则请遵守标准习语
  1. 他们阻止你做你需要的事情;
  2. 你有一个非常敬业和值得信赖的开发团队或者至少有额外的检查工具。

答案 2 :(得分:1)

如果针对两个或更多异常执行的操作相似,则将它们组合在一起。但如果你这样做,那就做对了:

try {
    // foo
} catch (ExceptionClass1 | ExceptionClass2 | ExceptionClass3 e) {
    // error foo
}

有关多个异常处理的详细信息,请参阅:Javadoc

答案 3 :(得分:0)

只需要使用多个catch而不是使用

的实例

Java支持多个catch语句有一个原因,从Java 7开始,你甚至可以使用' multicatch'像这样:

try {
    ...
}
catch (IOException | OtherException | MyException e) {
    ...
}

更多信息: -

http://baptiste-wicht.com/posts/2010/05/better-exception-handling-in-java-7-multicatch-and-final-rethrow.html

http://tutorials.jenkov.com/java-exception-handling/catching-multiple-exceptions.html

答案 4 :(得分:0)

您应该明确使用catch{}块,而不是手动模拟异常处理机制。

较新版本的Java允许您在一个catch{}块中合并多个异常:

try {
  // ...
} catch (E1 | E2 | E3 e) {
  // handle e
}

答案 5 :(得分:0)

最好使用具有不同异常变量的更多catch块。

完全像你问题中的例子。

答案 6 :(得分:0)

在Java 7中,我们可以使用如下的try catch块,

try
{
    catch(IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e)
    {
       // code goes here
    }
}