如果在读取时存在IOException,如何返回500状态代码

时间:2015-04-17 16:46:19

标签: java exception-handling

说我有以下代码段

public boolean checkListing() {

    try {

        // open the users.txt file
        BufferedReader br = new BufferedReader(new FileReader("users.txt"));

        String line = null;
        while ((line = br.readLine()) != null) {
            String[] values = line.split(" ");
            // only interested for duplicate usernames
            if (username.equals(values[0])) {
                return true;
            }
        }
        br.close();
        return false;
    } catch (IOException e) {
        e.printStackTrace();
        // what to do here
    }

}

如果发生异常,我该如何处理错误? 我想知道它发生了并将500代码返回给用户。

我应该抛出异常并将其捕获到其他类中吗?

有没有更优雅的方式来获得反馈?

4 个答案:

答案 0 :(得分:1)

您可以返回此类的实例:

public class Result {

    private boolean errorOccurs;
    private boolean isValid;
    private Exception exception;

    public Result(boolean isValid){
        this(isValid, false, null);
    }

    public Result(boolean isValid, boolean errorOccurs, Exception exception){
        this.isValid = isValid;
        this.errorOccurs = errorOccurs;
        this.exception = exception;
    }

    public boolean isValid(){
        return isValid;
    }

    public boolean errorOccurs(){
        return errorOccurs;
    }

    public Exception getException(){
        return exception;
    }
}

在你的情况下:

public Result checkListing() {

    try {

        // open the users.txt file
        BufferedReader br = new BufferedReader(new FileReader("users.txt"));

        String line = null;
        while ((line = br.readLine()) != null) {
            String[] values = line.split(" ");
            // only interested for duplicate usernames
            if (username.equals(values[0])) {
                return new Result(true);
            }
        }
        br.close();
        return new Result(false);
    } catch (IOException e) {
        e.printStackTrace();
        return new Result(false, true, e);
    }
}

结果类的缩写:)

public class Result {
    public boolean errorOccurs;
    public boolean isValid;
    public Exception exception;
}

答案 1 :(得分:0)

在这种情况下,可以IOExceptionreadLine抛出close

此异常表示发生了异常情况,例如流的源不再可用。您的程序可以恢复,或重新读取源或向用户报告此问题。

由您来决定做什么,取决于您的逻辑,这里没有首选方法。

请注意,您应该关闭br块中的finally

答案 2 :(得分:0)

更好的方法是抛出包装异常:

try (FileReader fr = new FileReader("users.txt")) {
    try (BufferedReader br = new BufferedReader(fr)) {

        // ... do your work

    } catch (IOException e) {
        throw new RuntimeException(e);
    }
} catch (IOException e1) {
    throw new RuntimeException(e1); 
}

注意,这里我在try语句中打开资源,从而使它们在执行结束时自动关闭,而不依赖于执行结果。

答案 3 :(得分:0)

我见过的两种最常见的方法,如Sasha Salauyou指出的,一种重新抛出(可能包裹)或一个提供更多信息的单独对象。

您在此尝试处理的基本问题是,您有一个方法要返回两个以上的值,返回类型只能表示两个。因此,您必须返回支持所需的所有可能返回值的类型,或者必须找到备用返回路径(例如异常)。

在我自己的代码中,我倾向于赞成重新抛出。编写专用的返回对象变得很难与IO长期维护,因为有太多不同的方法可以使事情失败。但是,我会偏离建议的路线(将原始例外作为原因的例外),因为通常没有强烈的理由进行包装。只需声明你的checkListing方法抛出IOException,在catch块中记录你的消息或stacktrace,然后抛出原始异常。