【问题标题】:How should I handle the IOException thrown by the function BufferReader.readline()?我应该如何处理函数 BufferReader.readline() 抛出的 IOException?
【发布时间】:2013-09-04 01:44:13
【问题描述】:

每次遇到java异常,我总是陷入两难的境地,是直接抛出异常还是捕获异常。如果捕获异常,是打印堆栈跟踪还是在catch块中做更多的工作?比如我是逐行读取文件,函数BufferedReader.readLine()抛出IOException,貌似是checked strong>(与 unchecked 异常相比)异常,因为用户被告知要明确处理此异常,对吗?虽然我必须处理它,但似乎除了打印堆栈跟踪我什么都做不了,好吧,这真的很奇怪。我应该捕获还是抛出这个异常?如果我抓住了它,我应该在 catch 块中做什么?

【问题讨论】:

标签: java exception exception-handling ioexception


【解决方案1】:

这是关于哪个部分负责此异常

例如,如果您正在将工具包开发为 jar,也许您应该将IOException 放入 类似PrasadIOUtils.ReadFile(String path) 的方法中,它应该只提供以下功能读取文件,不处理异常。

相比之下,当您在代码中调用方法PrasadIOUtils.ReadFile(String path) 时,您应该捕获Exception。因为这是您的逻辑部分,而您是负责处理Exception 以使您自己的项目更加健壮和容错的人。

这只是我的理解,希望对您有所帮助。 :)

附:如果您仍然对除了打印期望的堆栈跟踪之外别无他法感到困惑,您可以谷歌 异常链 以获取更多信息。这是一个java设计模式,也许它会让你在Exception上了解更多。

【讨论】:

  • 是的。让我概括一下。在每种情况下,您都必须考虑您所在方法的合同(它应该做什么)。如果在抛出 IOException 之后,该方法仍然可以做它应该做的事情,那么捕获它并履行方法契约。如果在抛出 IOException 之后,封闭方法无法完成它应该做的事情,那么让异常传播。因此,继续上面的示例 readFile() 只是应该读取文件,如果不能,它应该抛出。时期。但是更高级别的方法 readFileIfPossibleOrShowDialog() 必须要赶上。
【解决方案2】:

不仅仅是打印堆栈跟踪,

  • 您可以将异常信息放在单独的日志中
  • 如果发生异常,您可以关闭并删除文件,如果您正在编写或任何您想要的。

如果你回避异常,调用方法将不得不处理它。

【讨论】:

    【解决方案3】:

    你可以做以下事情:

    1. 在日志文件中记录异常信息。您可以使用以下方法填充异常信息。

      公共字符串 populateExceptionStackTrace(异常 e) { StringBuilder sb = new StringBuilder(); sb.append(e.toString()).append('\n'); for (StackTraceElement elem : e.getStackTrace()) { sb.append("\tat").append(elem).append('\n'); } 返回 sb.toString(); }

    2. 如果 InputStream 不为空,请尝试关闭它。

    3. 抛出您自己的异常并带有有意义的消息,让用户知道发生了什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-14
      • 2012-03-31
      • 2021-03-31
      • 2012-01-16
      • 1970-01-01
      • 2011-07-15
      • 2019-11-12
      • 1970-01-01
      相关资源
      最近更新 更多