我已经创建了从文本文件中读取文本(json,xml等)的代码,并将其转换为字符串,然后可以被其他代码用于转换为普通的旧java对象或由jackson注释的POJOS 。
我不确定我的代码是否正确处理了异常。到目前为止,我已经使用了我的代码之后提到的原则(阅读这个下载选民!!!)来开发代码。请注意,我不能使用try with resources,因为我遇到了Java 6(即使我的项目JRE是1.8)。
F1001
F1002
F1003
...
F1100
F2001
F2002
...
F2100
M3001
M3002
...
M3100
M4001
M4002
...
M4100
原理:
1)首先捕获最具体的异常,然后在异常层次结构中捕获它之上的异常。即,稍后捕获FileNotFoundException 1st和IOException。 Refer point 5 here
2)不要从finally块内部返回,因为只要尝试"完成"完全或突然。 Refer this SO answer
3)清理finally块中的缓冲读取器等资源。 Refer point 1 here
4)不要打电话给'#34;危险"方法(即可以抛出异常),必须知道/抛出其中的每个异常。即危险方法不应该"抛出FileNotFoundException,IOException ... etc"。 refer this link, specifically the last paragraph
代码中的缺陷: 如果执行前两个catch块中的任何一个,那么很可能没有读取整个文件。但是,无论如何,我的方法将返回一个字符串。字符串可以为null或不完整。
问题 -
1)我想在文本文件未成功转换为字符串时抛出异常,即执行三个catch块中的一个。我应该在一个普通的Exception对象中的每个catch块中包装异常并抛出它还是做其他事情吗?
2)如何改进/修复此代码的异常处理?
答案 0 :(得分:2)
简单回答:不要抓住例外。让来电者抓住他们。他是需要知道的人,知道如何处理他们。这种方法肯定不会。
4)不要让“危险”方法的调用者(即可能抛出异常),必须知道/抛出其中的每个异常。即危险方法不应该“抛出FileNotFoundException,IOException ...等”。请参阅此链接,特别是最后一段。
我对这个'原则'没有太多考虑,而且无论如何它实际上并不适用于此。抛出的唯一例外是IOException
和FileNotFoundException
,它是从中派生出来的。如果他不希望,呼叫者不必处理这两种情况。但是,他可能希望完全,如果例如丢失的文件构成部署错误。
答案 1 :(得分:1)
您有两种选择:
FileToStringFailedException
), 包装 实际异常。包装部分非常重要,因此当调用链中的某个人执行printStackTrace()
时,您会得到一个Caused By
部分来解释真正的失败。任一选项都有效,您选择哪一个取决于整体设计。对于简单的事情,我只是让异常向上渗透;如果我正在设计一个包含其他自定义包装器异常的大型复杂库,我可以选择选项2.
如果没有更多关于你正在做什么以及它适合你的系统的背景,那么就不可能说一个选项“更好”。
无论你做什么, 从不 都会干扰实际的异常。例外是程序员,而不是用户。如果您希望用户出现“友好”错误,请在向用户显示异常的位置执行此操作,但请确保为程序员记录原始异常。否则当你的“友好”例外隐藏了解决问题所需的重要信息时,你会后悔严重。