如果读取时出现 IOException,如何 return 500 状态码
How to return a 500 status code if there is an IOException while reading
假设我有以下片段
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
}
}
如果出现异常,应该如何处理错误?
我想知道它发生了,并且 return 一个 500 代码返回给用户。
我应该抛出异常并在另一个 class 中捕获它吗?
是否有更优雅的方式来获得反馈?
在这种情况下,IOException
可以从 readLine
或 close
中抛出。
此异常表示发生了异常情况,例如流的源不再可用。您的程序 可以 恢复,或者通过重新阅读源代码或向用户报告此问题。
由您决定如何操作,具体取决于您的逻辑,此处没有首选方式。
请注意,您应该在 finally
块中关闭 br
。
您可以 return 这个 class 的实例:
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);
}
}
以及结果的缩写形式 class:)
public class Result {
public boolean errorOccurs;
public boolean isValid;
public Exception exception;
}
更好的方法是抛出包装异常:
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 所指出的,我见过的两种最常见的方法是重新抛出(可能包装)或提供更多信息的单独对象。
你试图在这里处理的根本问题是你有一个方法,你想要 returning 两个以上的值,return 类型只能表达二。因此,您要么必须 return 支持您需要的所有可能 return 值的类型,要么必须找到备用 return 路径(如异常)。
在我自己的代码中,我倾向于在此处重新抛出。写一个专用的 return 对象很难用 IO 长期维护,因为有太多不同的方法会导致失败。但是,我会偏离建议的路线(将原始异常作为原因的异常)只是因为通常没有强有力的包装理由。只需声明您的 checkListing 方法以抛出 IOException,在 catch 块中记录您的消息或堆栈跟踪,然后抛出原始异常。
假设我有以下片段
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
}
}
如果出现异常,应该如何处理错误? 我想知道它发生了,并且 return 一个 500 代码返回给用户。
我应该抛出异常并在另一个 class 中捕获它吗?
是否有更优雅的方式来获得反馈?
在这种情况下,IOException
可以从 readLine
或 close
中抛出。
此异常表示发生了异常情况,例如流的源不再可用。您的程序 可以 恢复,或者通过重新阅读源代码或向用户报告此问题。
由您决定如何操作,具体取决于您的逻辑,此处没有首选方式。
请注意,您应该在 finally
块中关闭 br
。
您可以 return 这个 class 的实例:
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);
}
}
以及结果的缩写形式 class:)
public class Result {
public boolean errorOccurs;
public boolean isValid;
public Exception exception;
}
更好的方法是抛出包装异常:
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 所指出的,我见过的两种最常见的方法是重新抛出(可能包装)或提供更多信息的单独对象。
你试图在这里处理的根本问题是你有一个方法,你想要 returning 两个以上的值,return 类型只能表达二。因此,您要么必须 return 支持您需要的所有可能 return 值的类型,要么必须找到备用 return 路径(如异常)。
在我自己的代码中,我倾向于在此处重新抛出。写一个专用的 return 对象很难用 IO 长期维护,因为有太多不同的方法会导致失败。但是,我会偏离建议的路线(将原始异常作为原因的异常)只是因为通常没有强有力的包装理由。只需声明您的 checkListing 方法以抛出 IOException,在 catch 块中记录您的消息或堆栈跟踪,然后抛出原始异常。