Re: Are Errors in a Future body rethrown, as per the documentation?
Andrew Phillips <[email protected]>
| Newsgroups | gmane.comp.lang.scala |
|---|---|
| Message-ID | <[email protected]> |
Hi Viktor
> See the revision history / Issues for details.
Thanks for the hint. The last change related to this seems to have
been SI-7029 ("Fork join execution context loses fatal exceptions") [1],
which added code to pass any exceptions caught to the fork-join pool
thread's uncaught exception handler [2]. The above example is not related
to the fork-join executor, however.
The discussion in the issue has hopefully put me on the right track,
though: what seems to be the case is that only *fatal* exceptions (as
determined by NonFatal [3]) are re-thrown...and this includes
ControlThrowable and InterruptedException, but *not* Error.
Tweaking my original example to use InterruptedException gives the desired
result:
scala> Future { throw new InterruptedException("bang!") }.value
DEBUG: running
scala.concurrent.impl.Future$PromiseCompletingRunnable@7e6ce0a3
java.lang.InterruptedException: bang!
at $anonfun$1.apply(<console>:12)
at $anonfun$1.apply(<console>:12)
at
scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future
.scala:24)
at
scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
at SameThreadExecutionContext$.execute(<console>:13)
at scala.concurrent.impl.Future$.apply(Future.scala:31)
at scala.concurrent.Future$.apply(Future.scala:492)
... 33 elided
See https://github.com/scala/scala.github.com/pull/434
Regards
ap
[1] https://issues.scala-lang.org/browse/SI-7029
[2] https://github.com/scala/scala/commit/3f78bee128bd6a478bef6a66c5574f77a2d6dd74
[3] https://github.com/scala/scala/blob/2.11.x/src/library/scala/util/control/NonFatal.scala#L37
On Monday, July 13, 2015 at 5:05:12 PM UTC-4, √iktor Klang wrote:
>
> Hi Andrew,
>
> I think that behaviour was changed later on.
> See the revision history / Issues for details.
>
> On Mon, Jul 13, 2015 at 10:09 PM, Andrew Phillips <[email protected]
> <javascript:>> wrote:
>
>> Hi all
>>
>> With regard to the handling of Errors, the "Futures and Promises"
>> documentation [1] states:
>>
>> ExecutionException - stored when the computation fails due to an
>>> unhandled InterruptedException, Error or a
>>> scala.util.control.ControlThrowable. In this case the ExecutionException
>>> has the unhandled exception as its cause. *These exceptions are
>>> rethrown in the thread executing the failed asynchronous computation.*
>>
>>
>> Is this latter statement true in general, e.g. also if you supply your
>> own ExecutionContext? Or does it depend on the ExecutionContext
>> implementation?
>>
>> In this example at least, nothing seems to be rethrown (or passed to
>> reportFailure, for that matter):
>>
>> Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java
>> 1.7.0_40).
>>
>>
>> import scala.concurrent.Future
>> import scala.concurrent.ExecutionContext
>> import scala.util.{Failure, Success}
>>
>>
>> implicit object SameThreadExecutionContext extends ExecutionContext {
>> override def execute(runnable: Runnable): Unit = {
>> println("DEBUG: running " + runnable)
>> runnable.run()
>> }
>> override def reportFailure(t: Throwable): Unit = ??? // never called?
>> }
>>
>> scala> Future { throw new Error("bang!") }.value
>> DEBUG: running
>> scala.concurrent.impl.Future$PromiseCompletingRunnable@887b5d0
>> res1: Option[scala.util.Try[Nothing]] =
>> Some(Failure(java.util.concurrent.ExecutionException: Boxed Error))
>>
>>
>> Am I missing something or misreading the docs here?
>>
>> Regards
>>
>> ap
>>
>> [1] http://docs.scala-lang.org/overviews/core/futures.html#exceptions
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "scala-language" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
>
> --
> Cheers,
> √
>
--
You received this message because you are subscribed to the Google Groups "scala-language" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
For more options, visit https://groups.google.com/d/optout.