如何在使用缓冲读卡器读取文件时处理异常?

时间:2017-12-05 05:55:42

标签: java exception

我已经创建了从文本文件中读取文本(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)如何改进/修复此代码的异常处理?

项目结构enter image description here

2 个答案:

答案 0 :(得分:2)

简单回答:不要抓住例外。让来电者抓住他们。他是需要知道的人,知道如何处理他们。这种方法肯定不会。

  

4)不要让“危险”方法的调用者(即可能抛出异常),必须知道/抛出其中的每个异常。即危险方法不应该“抛出FileNotFoundException,IOException ...等”。请参阅此链接,特别是最后一段。

我对这个'原则'没有太多考虑,而且无论如何它实际上并不适用于此。抛出的唯一例外是IOExceptionFileNotFoundException,它是从中派生出来的。如果他不希望,呼叫者不必处理这两种情况。但是,他可能希望完全,如果例如丢失的文件构成部署错误。

答案 1 :(得分:1)

您有两种选择:

  1. 不要抓住异常并让来电者与他们打交道
  2. 抓住异常并抛出您自己的自定义异常(例如FileToStringFailedException), 包装 实际异常。包装部分非常重要,因此当调用链中的某个人执行printStackTrace()时,您会得到一个Caused By部分来解释真正的失败。
  3. 任一选项都有效,您选择哪一个取决于整体设计。对于简单的事情,我只是让异常向上渗透;如果我正在设计一个包含其他自定义包装器异常的大型复杂库,我可以选择选项2.

    如果没有更多关于你正在做什么以及它适合你的系统的背景,那么就不可能说一个选项“更好”。

    无论你做什么, 从不 都会干扰实际的异常。例外是程序员,而不是用户。如果您希望用户出现“友好”错误,请在向用户显示异常的位置执行此操作,但请确保为程序员记录原始异常。否则当你的“友好”例外隐藏了解决问题所需的重要信息时,你会后悔严重。