<div dir="ltr">Perhaps a simple change from "this stage/the returned stage" to "the input stage/the output stage" would be helpful?<div><br></div><div>Chris<br><br><div class="gmail_quote"><div dir="ltr">On Mon, 21 Dec 2015 at 19:37 Joe Bowbeer <<a href="mailto:joe.bowbeer@gmail.com">joe.bowbeer@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Thanks for clarifying!</div><div><br></div><div>I had to read the spec several more times before I could parse that meaning, but now that I see it, it is also hard to mistake :-)</div><div><br></div><div>The spec talks about "this stage" and the "returned stage" and I was confused by all the "this".</div><div><br></div><div>In the spec wording, below, "this stage" is stage1 throwing exception1 and the "returned stage" is stage2 throwing exception2. The last phrase contains a "this exception" referring to exception2 and also a "this stage" referring to stage1, which is especially confusing.<br></div><div><br></div><div>Annotated:<br></div><div><br></div>"If the supplied action [action2] itself encounters an exception [exception2], then the returned stage [stage2] exceptionally completes with this exception [exception2] unless this stage [stage1] also completed exceptionally [exception1]."<div><br></div><div>I had been interpreting the final "this stage" to mean the next stage...<br><br>Given my new understanding of the spec, throwing exception1 with suppressed exception2 (a la try-with-resources) makes a lot of sense.<br><br>To be clear, is the current jdk8 behavior *not* compliant with spec?</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Dec 21, 2015 at 10:49 AM, Doug Lea <span dir="ltr"><<a href="mailto:dl@cs.oswego.edu" target="_blank">dl@cs.oswego.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span>On 12/21/2015 01:12 PM, <a href="mailto:joe.bowbeer@gmail.com" target="_blank">joe.bowbeer@gmail.com</a> wrote:<br>
</span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span>
In the second survey email, the only options clearly *compatible* with the<br></span>
CompletionStage spec are ...<br>
</blockquote>
<br>
No. Here's jdk8 spec:<span><br>
<br>
"If the supplied action itself encounters an exception, then the returned stage exceptionally completes with this exception unless this stage also completed exceptionally."<br>
<br></span>
Which describes options A and B. Option B also adds as suppressed<br>
the whenComplete exception, which is not required but not disallowed<br>
by current spec.<br>
<br>
Options C would comply only if the "unless" clause were dropped.<br>
<br>
Options D and E would require more changes.<br>
<br>
where, as a reminder...<span><br>
<br>
  CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> {<br>
     if (true)<br>
        throw new FirstException();<br>
     else<br>
        return "A";<br>
   });<br>
<br>
  CompletableFuture<String> f2 = f1.whenComplete((result, exception) -> {<br></span>
    if (true)<br>
       throw new SecondException();<br>
   });<br>
<br>
A. The FirstException. In other words, preserve the source outcome (only) if exceptional, ignoring the SecondException.<br>
<br>
B. The FirstException, with the SecondException as its suppressed exception.  In other words, preserve but modify the source exception to record the SecondException.<br>
<br>
C. The SecondException. In other words, replace the source outcome (whether it is exceptional or not).<br>
<br>
D. The SecondException, with the FirstException as its suppressed exception.  In other words, replace the source outcome, but if exceptional, record it as a suppressedException of the SecondException.<br>
<br>
E. A new CompletionException, with the FirstException as its cause and the SecondException as its suppressed exception. In other words, indicate that throwing an exception in whenComplete is a different form of error.<br>
<br>
<br>
<br>
</blockquote></div><br></div>
_______________________________________________<br>
Concurrency-interest mailing list<br>
<a href="mailto:Concurrency-interest@cs.oswego.edu" target="_blank">Concurrency-interest@cs.oswego.edu</a><br>
<a href="http://cs.oswego.edu/mailman/listinfo/concurrency-interest" rel="noreferrer" target="_blank">http://cs.oswego.edu/mailman/listinfo/concurrency-interest</a><br>
</blockquote></div></div></div>