Java 如果读取时出现IOException,如何返回500状态代码

Java 如果读取时出现IOException,如何返回500状态代码,java,exception-handling,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) {

假设我有以下代码片段

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代码返回给用户

我应该抛出异常并在另一个类中捕获它吗


有没有更优雅的方法来获取反馈?

在这种情况下,可以从
readLine
close
抛出
IOException

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

这是由你决定做什么,取决于你的逻辑,这里没有更好的方法


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

您可以返回此类的实例:

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);
    }
}
以及结果类的缩写形式:)


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

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
语句中打开资源,从而使它们在执行结束时自动关闭,而不依赖于执行结果。

正如Sasha Salauyou所指出的,我见过的两种最常见的方法是一个rethrow(可能是包装的)或一个提供更多信息的单独对象

这里要解决的基本问题是,您有一个方法,希望返回两个以上的值,返回类型只能表示两个。因此,您要么必须返回一个支持所有可能的返回值的类型,要么必须找到其他返回路径(如异常)


在我自己的代码中,我倾向于在这里重新引用。编写一个专用的返回对象变得很难用IO长期维护,因为有太多不同的方式导致失败。然而,我会偏离建议的路线(将原始异常作为原因的异常),仅仅是因为通常没有强有力的理由进行包装。只需声明您的checkListing方法来抛出IOException,在catch块中记录您的消息或stacktrace,然后抛出原始异常。

1)抛出包含初始异常的异常作为原因;2) 使用复合
{result,code,failure reason}
对象返回。我更喜欢1)因为它既优雅又有用:从任何执行点都可以看到失败的全部痕迹。@Sashasalau谢谢你的回答。不过我在理解上有点困难。你能给我一个关于第二种方法的来源吗?顺便说一句,不要忘记关闭
br
中的
finally
block,否则一连串的失败可能会导致资源泄漏。@SashaSalauyou很抱歉,但正如我所说的,我不理解你的建议。抱歉,如果我不能完全理解。我的意思是,所有资源,如
FileReader
s和
BufferedReader
s,都应该在执行结束时关闭。在我的回答中,我提供了如何自动管理它的代码片段。这正是我想要的。先生,非常感谢你的回答。
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); 
}