Hi Brian,

On 06/24/2015 09:04 PM, Brian Burkhalter wrote:
Please review at your convenience.

Issue:  https://bugs.openjdk.java.net/browse/JDK-8042377
Patch:  http://cr.openjdk.java.net/~bpb/8042377/webrev.00/

The use of try-with-resources in FilteredOutputStream.close() is replaced with 
explicit handling of IOExceptions potentially thrown by flush() or close(). A 
test covering all cases is added.

Thanks,

Brian

Modified code is a little different semantically from try-with resources. in case both flush() and out.close() throw, try-with resources propagates the exception thrown from flush() while modified code propagates exception thrown from out.close(). But that, I think, is actually preferable in this case, since we are calling method close() on FilterOutputStream.

The other semantic difference is when flush() and/or out.close() throw unchecked exception. In try-with-resources case, unchecked exception from out.close() is always added as suppressed to the exception from flush() while in modified code, unchecked exception from flush() is ignored when out.close() also throws. Also, IOExceptio from flush() is ignored if out.close() throws unchecked exception. Here's how both exceptions can be considered regardless of whether they are IOException or unchecked:

    public void close() throws IOException {
        if (closed.compareAndSet(false, true)) {
            Throwable flushException = null;
            try {
                flush();
            } catch (Throwable e) {
                flushException = e;
                throw e;
            } finally {
                if (flushException == null) {
                    out.close();
                } else {
                    try {
                        out.close();
                    } catch (Throwable closeException) {
                        if (flushException != closeException) {
closeException.addSuppressed(flushException);
                        }
                        throw closeException;
                    }
                }
            }
        }
    }


Regards, Peter

Reply via email to