首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理使用缓冲读取器读取文件时的异常?

如何处理使用缓冲读取器读取文件时的异常?
EN

Stack Overflow用户
提问于 2017-12-05 05:55:42
回答 2查看 4.4K关注 0票数 1

我编写了阅读文本的代码(json,xml等)并将其转换为字符串,然后由其他代码使用这些字符串将其转换为由jackson注释的普通旧java对象或POJOS。

我不确定我的代码是否正确地处理异常。到目前为止,我已经使用了在我的代码(阅读下面的投票者!)之后提到的原则来开发代码。请注意,我不能在资源中使用try,因为我被Java 6困住了(尽管我的项目JRE是1.8)。

代码语言:javascript
复制
package com.testing;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class JunkEx {

    public static void main(String[] args) {
        String filePath = ".\\src\\test\\resources\\text-files\\orders\\orders-2017.txt";
        String contents = fileToString(filePath);
        System.out.println(contents);
    }

    private static String fileToString(String filePath) {
        StringBuilder stringBuilder = null;
        BufferedReader br = null;

        try {
        br = new BufferedReader(new FileReader(filePath));
        stringBuilder = new StringBuilder();
        String currentLine;
        while ((currentLine = br.readLine()) != null) {
            stringBuilder.append(currentLine);
            stringBuilder.append("\n");
        }

        }catch (FileNotFoundException ex1) {
            ex1.printStackTrace();
        }catch (IOException ex2) {
            ex2.printStackTrace();
        }finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return stringBuilder.toString();
    }

}

原理

1)首先捕获最具体的异常,然后在异常层次结构中捕获上面的异常。即先抓FileNotFoundException,后接IOException。请参阅这里的第5点

2)不要从最后一个块中返回,因为最终总是被执行,只要尝试“完成”充分或突然。请参考以下答案

3)清理最后块中的缓冲读取器等资源。请参阅此处的第1点

4)不要让“危险”方法的调用者(即可能抛出异常的方法)知道/抛出其中的每个异常。即危险方法不应“抛出FileNotFoundException,IOException...etc”。请参考此链接,特别是最后一段。

代码中的缺陷:如果执行前两个catch块中的任何一个,则很可能没有读取整个文件。但是,无论如何,我的方法都会返回一个字符串。字符串可以是空的,也可以是不完整的。

Questions -

1)我想在文本文件没有成功转换为字符串时抛出一个异常,即执行三个catch块之一。我是否应该将异常包装在一个通用异常对象中的每个catch块中,然后抛出该异常或执行其他操作?

2)如何改进/修复此代码的异常处理?

项目结构

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-05 06:54:26

你有两个选择:

  1. 不要捕捉异常,让调用者处理它们
  2. 捕获异常并抛出您自己的自定义异常,比如FileToStringFailedException包装实际异常。包装部分非常重要,因此当调用链上的人执行printStackTrace()时,您将得到一个解释真正故障的Caused By部分。

这两个选项都有效,您选择的选项取决于总体设计。对于一些简单的东西,我只会让异常向上渗出;如果我正在设计一个包含其他自定义包装异常的大型复杂库,我可以选择选项2。

如果没有更多关于您正在做什么以及它适合您的系统的上下文,就不可能说一个选项是“更好的”。

无论您做什么,从不干预实际的异常。例外情况属于程序员,而不是用户。如果您希望对用户“友好”错误,请在向用户显示异常的时候这样做,但是要确保程序员记录了原始的异常。否则,当您的“友好”异常隐藏您需要解决问题所需的关键信息时,您会非常后悔。

票数 1
EN

Stack Overflow用户

发布于 2017-12-05 06:25:55

简单的回答:根本不要捕捉异常。让来电者抓住他们。他是那个需要知道的人,他知道该怎么对付他们。这种方法当然不是。

4)不要让“危险”方法的调用者(即可能抛出异常的方法)知道/抛出其中的每个异常。即危险方法不应“抛出FileNotFoundException,IOException...etc”。请参考此链接,特别是最后一段。

我不认为这个‘原则’,而且在任何情况下,它实际上不适用于这里。引发的唯一异常是IOExceptionFileNotFoundException,它们是由此派生的。如果打电话的人不愿意的话,他不需要处理这两件事。但是,如果丢失的文件构成部署错误,他可能希望这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47646945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档