java - 我应该如何使用 `try-with-resources` 中的 IOException 嵌套在 header 中带有`throws IOException`的方法中?

标签 java eclipse exception try-with-resources

AFAIK,标准try-with-resources 形式

try(InputStream is= new ...){
    ... some reading from is
} catch (..){
    ... catching real problems
}
catch (IOException e) {
    ... if closing failed, do nothing - this clause is demanded by syntax
}

相当于:

try{
    InputStream is= new ...
    ... some reading from is
} catch (..){
    ... catching real problems
} finally {
    try{
        is.close();
    } catch (IOException e) {
        ... if closing failed, do nothing
    }
}

当然,第一个变体更简单。但我看到第二种情况是绝对可以的,而第一种就变得难以理解。

想象一下这样的情况,当您获得代码时,try(){} 出现在带有 throws IOExceptions 子句的函数中。

String readFromFile(...) throws IOException{
    ...
    try(...){
        ...
    }
}

第二个 catch 中的 IOException 会吃掉所有 IOException,无论是否连接到关闭尝试。并且什么也不做。我想,在该方法之外的某个地方,有一段代码可以处理该 IOException 并执行一些值得注意的操作。例如,记录堆栈。因此,本地的渔获量永远不会达到。我们对第二个 catch 子句不感兴趣,但通常,我们需要对第一个 catch 子句进行一些特殊的 react 。

另一方面,如果我们删除结束的 catch(IOException e){} 子句,并依赖于方法头中的 throws,那对我们来说绝对无趣将对关闭异常使用react。

当我们通过 IOException 捕获关闭问题时,我认为没有办法解决这个问题。 Eclipse java 编辑器要求我对该子句使用这个异常!

如何将关闭时出现的 IOException 与 try{} 主体中出现的其他 IOException 分开?

最佳答案

我认为 Java 应该为此负责。 close() 方法应该抛出与 IOException 不同的异常,调用者对此几乎无能为力。您唯一的解决方案是在重新抛出之前重新包装您感兴趣的 IOException。

通常我所做的是将 try block 的全部内容提取到它自己的方法中,在该方法中我可以捕获任何 IOException 并将它们作为自定义异常重新抛出。然后我可以在 catch block 中单独捕获剩余的 IOException。

public void foo() throws CustomException {

    try (InputStream is= new ...) {
        bar(is); //This catches internal IOExceptions and throws a CustomException
    }
    catch (IOException e) { //The close() exception
        

    }
}

关于java - 我应该如何使用 `try-with-resources` 中的 IOException 嵌套在 header 中带有`throws IOException`的方法中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48705633/

相关文章:

android - 找不到与给定名称 'Theme.AppCompat.Light.DarkActionBar' 匹配的资源

eclipse - Servlet 和 JSP 文件与 Tomcat 和 Eclipse 的 URL 映射

c# - 捕获另一个表单抛出的异常

java - 在GWT中添加html和java脚本代码

java - Android Google Play 通知不会将用户带到游戏屏幕

java - Java真的很慢吗?

c++ - Qt和错误处理策略

JavaFX如何将对话框/警报带到屏幕前面

java - 在 eclipse jdt/ast 中使用 ICompilationUnit 进行 ASTParser.setSource() 方法

Android 抛出异常