如果一个方法抛出了一个 IOException 异常,那么这样做是否会产生负面影响:
catch (Exception ex){
}
代替
catch (IOException ex){
}
在我的 Java 代码中?
当然有/有!
如果您捕获Exception
,您将捕获所有异常(除了Throwable
orError
及其子类的实例)。这意味着您将捕获各种未经检查的异常,以及您没有意识到可能会抛出的其他检查异常。
例如:
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 ...
}
简短的回答
任何最终会出现在第二个区块中的东西都会出现在第一个区块中。但是,有一大堆东西最终会出现在第一个中,而不会出现在第二个中。所以简而言之,你会捕获一大堆你不打算的异常。所以是的,这是个坏主意
不正确的修复应用于错误的问题
我假设在 catch 块内你有某种代码要修复或清理,IOException
或者至少告诉最终用户发生了什么(他希望他说),让这段代码运行对于任何Exception
可能导致意外结果。此外,它可以隐藏您甚至没有意识到正在发生的异常。
调试困难
想象一下,稍后您更改了导致空指针异常或数组越界的一段代码。然而它一直表现得好像发生了 IO 问题。与刚刚抛出 NullPointerException 相比,这将更难调试。
我已经说过了,但我会重申;那个空的 catch 块只是为了这个例子,对吧?
IOException 是从 Exception 继承的,所以当你这样做时:
catch (IOException ex)
您只是在捕获 IOException。
但是当你这样做时:
catch (Exception ex)
您正在捕获所有异常,包括 IOException。所以你不知道发生了哪个异常,当 IOException 以外的其他原因导致它时,可以调用它。如果有人想对所有异常一视同仁,可以使用 catch (Exception ex),但如果想对不同的异常类型采取不同的操作,则应该使用 catch (IOException ex)。
两种方式都可以打印错误消息。通过捕获任何 IOException。明确地,您可以像这样向用户显示自定义错误消息是错误重新升级到 IO 问题或没有其他与之相关的事情
异常处理程序可以做的不仅仅是打印错误消息或停止程序。他们可以进行错误恢复,提示用户做出决定,或使用链式异常将错误传播到更高级别的处理程序。
在捕获异常时,它不仅捕获 IOException,还捕获所有一般异常。
有些异常是用来报告编程错误的,就是这样的异常
程序员使用这些异常来指示他们的 API 使用不正确。
另一方面,有一些异常用于报告 API 内部发生的特定问题和异常情况,例如当我们收到 IOException 或 SQLException 时。
今天,习惯上使用未经检查的异常来解决这类问题,例如 JPA API 使用不同的未经检查的异常,如 PersistenceException。
现在,如果您捕获所有异常,那么您最终可能会捕获和处理编程错误以及应用程序异常情况。最好不要处理编程错误,以使它们明显并修复它们并捕获它们只是隐藏它们。
因此,最好首先努力捕获最具体的异常。