我编写了阅读文本的代码(json,xml等)并将其转换为字符串,然后由其他代码使用这些字符串将其转换为由jackson注释的普通旧java对象或POJOS。
我不确定我的代码是否正确地处理异常。到目前为止,我已经使用了在我的代码(阅读下面的投票者!)之后提到的原则来开发代码。请注意,我不能在资源中使用try,因为我被Java 6困住了(尽管我的项目JRE是1.8)。
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)如何改进/修复此代码的异常处理?
项目结构:

发布于 2017-12-05 06:54:26
你有两个选择:
FileToStringFailedException,包装实际异常。包装部分非常重要,因此当调用链上的人执行printStackTrace()时,您将得到一个解释真正故障的Caused By部分。这两个选项都有效,您选择的选项取决于总体设计。对于一些简单的东西,我只会让异常向上渗出;如果我正在设计一个包含其他自定义包装异常的大型复杂库,我可以选择选项2。
如果没有更多关于您正在做什么以及它适合您的系统的上下文,就不可能说一个选项是“更好的”。
无论您做什么,从不干预实际的异常。例外情况属于程序员,而不是用户。如果您希望对用户“友好”错误,请在向用户显示异常的时候这样做,但是要确保程序员记录了原始的异常。否则,当您的“友好”异常隐藏您需要解决问题所需的关键信息时,您会非常后悔。
发布于 2017-12-05 06:25:55
简单的回答:根本不要捕捉异常。让来电者抓住他们。他是那个需要知道的人,他知道该怎么对付他们。这种方法当然不是。
4)不要让“危险”方法的调用者(即可能抛出异常的方法)知道/抛出其中的每个异常。即危险方法不应“抛出FileNotFoundException,IOException...etc”。请参考此链接,特别是最后一段。
我不认为这个‘原则’,而且在任何情况下,它实际上不适用于这里。引发的唯一异常是IOException和FileNotFoundException,它们是由此派生的。如果打电话的人不愿意的话,他不需要处理这两件事。但是,如果丢失的文件构成部署错误,他可能希望这样做。
https://stackoverflow.com/questions/47646945
复制相似问题