在catch块中使用泛型异常是否有任何负面影响

时间:2013-09-23 12:52:42

标签: java exception try-catch

如果一个方法抛出一个IOException,那么是否有任何负面影响:

catch (Exception ex){

} 

而不是

catch (IOException ex){

}

在我的Java代码中?

5 个答案:

答案 0 :(得分:4)

当然有/是!

如果你抓住Exception,你将捕获所有异常(除了ThrowableError及其子类的实例)。这意味着您将捕获各种未经检查的异常,以及您未实现的其他已检查异常。

例如:

public class Test {
    private File file;

    public String load() {
        try {
            Reader r = new FileReader(file, "UTF-9");
            // read file
            return // file contents
        } catch (Exception ex) {
            return "cannot open file";
        }
    }
}

在这里,Exception的捕获隐藏了代码中的两个(!)错误。


  好的,谢谢。我想我会单独捕捉所有例外情况。

还有另一种选择。 Java 7允许您捕获多个异常,如下所示:

catch (IOException | IllegalArgumentException ex) {
    // handle both types of exception ...
}

答案 1 :(得分:1)

简短回答
任何最终会在第二个区块中结束的东西都会在第一个区块中结束。然而,有一大堆东西最终会在第一个不会在第二个中出现; 所以简而言之,你会抓住一大堆你并不打算的例外。所以是的,这是一个坏主意

错误修复应用于错误的问题
我假设在catch块中你有一些代码可以在IOException之后修复或清理,或者至少告诉最终用户发生了什么(他希望如此),让任何代码运行Exception可能会导致意外结果。此外,它可以隐藏您甚至没有意识到的异常。

调试困难
想象一下,您稍后会更改导致空指针异常的代码,或者数组超出范围。但它仍然表现得好像发生了IO问题。与刚刚抛出NullPointerException相比,调试要困难得多。


我已经说过了,但我会重申一下;那个空的catch块只适用于这个例子吗?

答案 2 :(得分:0)

IOException继承自Exception,所以当你这样做时:

catch (IOException ex)

您只是捕获IOException。

但是当你这样做时:

catch (Exception ex)

您正在捕获所有异常,包括IOException。所以你不知道发生了哪个异常,当IOException以外的东西引起它时,可以调用它。 如果有人想要同样处理所有异常,可以使用catch(Exception ex),但是如果想要对不同的异常类型采取不同的操作,则应该使用catch(IOException ex)。

答案 3 :(得分:0)

两种方式都可以打印错误信息。通过捕获任何IOException。 明确地,您可以向用户显示自定义错误消息,例如这是错误重新调整为IO问题或者没有与之相关的其他内容,例如

  

异常处理程序不仅可以打印错误消息或停止程序。他们可以进行错误恢复,提示用户做出决定,或者使用链式异常将错误传播到更高级别的处理程序。

在捕获Exception时,它不仅捕获所有常规异常IOException。

答案 4 :(得分:0)

一些例外用于报告编程错误,例如

之类的例外情况
  • 的ArrayIndexOutOfBounds
  • 的NullPointerException
  • IllegalArgumentException等。

程序员使用这些异常来表明他们的API使用不当。

另一方面,有一些异常用于报告API中发生的特定问题和异常情况,例如当我们收到IOException或SQLException时。

今天,习惯上对这类问题使用未经检查的异常,例如使用不同的未经检查的异常(如PersistenceException)的JPA API。

现在,如果您捕获所有异常,那么您最终可能会捕获并处理编程错误以及应用程序异常情况。编程错误最好不要处理,以使它们明显并修复它们并捕获它们只是隐藏它们。

因此,最好先努力捕捉可能的最具体的例外情况。