java - 为什么在捕获时使用 IOexception 而不是 Exception?

标签 java exception

我似乎无法用正确的措辞来让搜索引擎获取任何有意义的结果。

try{
    BufferedReader reader = new BufferedReader( new FileReader("foo.bar") );
}
catch(Exception e){
    println( e.getMessage() );
}

所以 FileReader 只抛出 FileNotFoundException,据我了解这是一个 IOException,这是一个异常。有人可以解释为什么我会捕获 FileNotFoundExceptionIOException 而不是只指定通用“异常”而不必导入异常(即导入 java.io. FileNotFoundException;)?严格来说是为了可读性吗?

我使用所有三个名称都捕获了异常,但我找不到区别。

编辑:--------------------

private BufferedReader askUserForFile(String prompt){
        BufferedReader rd = null;
        while(rd == null){
            try{
                String filename = readLine(prompt);
                rd = new BufferedReader( new FileReader(filename) );
            }
            catch(Exception e){
                println(e.getMessage());
            }
        }
        return rd;
    }

最佳答案

Exception 是所有异常之母,包括所有 RuntimeException 子类。当您指定要捕获它时,您会在网中得到比您想要的更多的鱼,例如 NullPointerExceptionIllegalArgumentException 等等。

虽然捕获通用Exception在代码中的某个时刻是正确的,但在任何较低层捕获它几乎肯定是错误的并且会损害行为您的应用程序。

在 Java 中学习更重要的技能不是如何捕获异常,而是如何不捕获它们,而是让它们向上传播调用堆栈,朝向异常屏障,代码中的一个常见位置,所有错误都被捕获并统一处理(通常通过日志记录、回滚事务等)。

关于java - 为什么在捕获时使用 IOexception 而不是 Exception?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20644559/

相关文章:

java - Spring MVC - 不支持请求方法 "POST"

java - 半透明 JFrame 边框 JDK 7

c# - 如何处理 Task.Factory.StartNew 异常?

java - 是什么导致了这个 MySQLSyntaxError 异常?

c++ - 你使用 C++ 异常做什么?

java - Ehcache key ...从 StoreAccessException : NullPointerException: null value 恢复

java - 游戏开发,移动相机时出现奇怪的图像效果

c# - 返回 bool,但加载多个对象的方法

c# - 尝试检索实体时,L2S 调用导致有关 int 的空分配的异常

python - 如何在单个地方处理 flask 中的一般异常?