On 10/02/2012 13:16, Alex Lam S.L. wrote:

To recover the previous behaviour, I think the following might just work:

try (OutputStream ostream = out) {
   flush();
} catch (IOException ignored) {
}

Remember try-with-resource-catch works the inside-out from try-catch-finally! You are discarding the close exception. So better would be:

try (OutputStream ostream = out) {
    try {
        flush();
    } catch (IOException ignored) {
    }
}

It'd be kind of nice to add the flush exception to the close exception if there is one. I think that would require abandoning try-with-resource and writing it all out in longhand. Or a half-way house:

IOException flushExc = null
try (OutputStream ostream = out) {
    try {
        flush();
    } catch (IOException exc) {
        flushExc = exc;
    }
} catch (IOException exc) {
    if (flushExc != null) {
        exc.addSuppressed(flushExc);
    }
    throw exc;
}

The decorators should never have attempted to proxy the resource release, but it's not 1995.

Tom

Reply via email to