<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sat, Dec 19, 2015 at 11:16 AM, Chris Purcell <span dir="ltr"><<a href="mailto:chris.purcell.39@gmail.com" target="_blank">chris.purcell.39@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><p dir="ltr">The second option surprised me, as we now have a fourth approach to suppressed exceptions in Java: try/finally (throw away A), try-with-resources (suppress B), j8 whenComplete (throw away B) and j9+ whenComplete (suppress A). Isn't this unnecessarily complicated?</p></blockquote><div><div>Like Joe, I would have voted against suppression if that had been given as a survey option.</div></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><p dir="ltr">Why not behave like a finally block, and let the user add A as a suppressed exception if they want it?</p></blockquote><div>Is this opt-in behavior not achievable with a wrapper? (Assuming survey-option-2-without-suppression semantics.)</div><div><br></div><div><font face="monospace, monospace">    public static <T> BiConsumer<T, Throwable> suppressEarlierException(</font></div><div><font face="monospace, monospace">            BiConsumer<? super T, ? super Throwable> action) {</font></div><div><font face="monospace, monospace">                </font></div><div><font face="monospace, monospace">        return (r1, ex1) -> {</font></div><div><font face="monospace, monospace">            try {</font></div><div><font face="monospace, monospace">                action.accept(r1, ex1);</font></div><div><font face="monospace, monospace">            } catch (Throwable ex2) {</font></div><div><font face="monospace, monospace">                ex2.addSuppressed(ex1);</font></div><div><font face="monospace, monospace">                throw ex2;</font></div><div><font face="monospace, monospace">            }</font></div><div><font face="monospace, monospace">        };</font></div><div><font face="monospace, monospace">    }</font></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<p dir="ltr">WhenComplete seems like the only way to reliably close resources in async code, so I expected it to work like try-with-resources. That seems to be the point of contention for others too. Perhaps there should be another method for this use-case instead? One which takes a simple runnable and suppresses any exception it throws.</p></blockquote><div>I don't see why CF.handle(BiFunction) isn't already sufficient for providing any behavior you want here.<br></div><div><br></div><div>--tim</div><div><br></div><div><br></div></div></div></div>