安全な close

トラックバック元のコードを勝手に添削。

  • Errorは即throw
  • tryブロック内で例外が出るとそれをthrow。closeも試みる。
  • closeだけで例外が発生した場合はそれをthrow

close で投げられる例外をハンドリングしたところでロギング以外にやることってあまり無いような気がするけど、そこは置いておいて。

public void foo() throws IOException {
    OutputStream out = new FileOutputStream("foo.txt");
    try {
        // いろいろ
    } catch (IOException e) {
        try {
            out.close();
        } catch (Exception e2) {
        }
        throw e;
    } catch (RuntimeException e) {
        try {
            out.close();
        } catch (Exception e2) {
        }
        throw e;
    }
    out.close();
}

Error は RuntimeException のサブクラスではなく Throwable のサブクラスなので、これだと、たとえば、assert なんかでこけたときは AssertionError が投げられて補足されないので close されない。普通に以下みたいなのでいいんじゃないかなぁ。

public void foo() throws IOException {
    OutputStream out = new FileOutputStream("foo.txt");
    try {
        // do something
        out.close();
    } finally {
        IOUtils.closeQuietly(out);
    }
}

とりあえず、3つの条件は満たせていると思うけど、変なところがあったら指摘よろしく。