Skip to content

Instantly share code, notes, and snippets.

@kermitas
Last active October 21, 2015 20:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kermitas/0edade6d73e02dd70ea2 to your computer and use it in GitHub Desktop.
Save kermitas/0edade6d73e02dd70ea2 to your computer and use it in GitHub Desktop.
By using future.recover() we can easily have informative stack traces.
package scala.concurrent
import scala.concurrent.duration._
import org.scalatest.FeatureSpec
class FutureStackTraceTest extends FeatureSpec {
ignore("stack trace of Future") {
implicit val executionContext = scala.concurrent.ExecutionContext.Implicits.global
val f = Future {
Unit
}.map { _ =>
Unit
}.map { _ =>
throw new Exception("Test exception.")
}.map { _ =>
Unit
}.map { _ =>
Unit
}
Await.result(f, 5 seconds)
/**
* Produces:
*
* [info] FutureStackTraceTest:
* [info] Scenario: stack trace of Future *** FAILED *** (9 milliseconds)
* [info] java.lang.Exception: Test exception.
* [info] at scala.concurrent.FutureStackTraceTest$$anonfun$1$$anonfun$4.apply(FutureStackTraceTest.scala:17)
* [info] at scala.concurrent.FutureStackTraceTest$$anonfun$1$$anonfun$4.apply(FutureStackTraceTest.scala:16)
* [info] at scala.util.Success$$anonfun$map$1.apply(Try.scala:206)
* [info] at scala.util.Try$.apply(Try.scala:161)
* [info] at scala.util.Success.map(Try.scala:206)
* [info] at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
* [info] at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
* [info] at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
* [info] at scala.concurrent.impl.ExecutionContextImpl$$anon$3.exec(ExecutionContextImpl.scala:107)
* [info] at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
* [info] at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
* [info] at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
* [info] at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
*/
}
scenario("stack trace of Future with recover") {
implicit val executionContext = scala.concurrent.ExecutionContext.Implicits.global
val f = Future {
Unit
}.map { _ =>
Unit
}.map { _ =>
throw new Exception("Problem in database.")
}.recover {
case e: Exception => {
throw new Exception("Problem while storing the data.", e)
}
}.map { _ =>
Unit
}.map { _ =>
Unit
}.recover {
case e: Exception => {
throw new Exception("General problem.", e)
}
}
Await.result(f, 5 seconds)
/**
* Produces:
*
* [info] Scenario: stack trace of Future with recover *** FAILED *** (10 milliseconds)
* [info] java.lang.Exception: General problem.
* [info] at scala.concurrent.FutureStackTraceTest$$anonfun$2$$anonfun$4.applyOrElse(FutureStackTraceTest.scala:68)
* [info] at scala.concurrent.FutureStackTraceTest$$anonfun$2$$anonfun$4.applyOrElse(FutureStackTraceTest.scala:66)
* [info] at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33)
* [info] at scala.util.Failure$$anonfun$recover$1.apply(Try.scala:185)
* [info] at scala.util.Try$.apply(Try.scala:161)
* [info] at scala.util.Failure.recover(Try.scala:185)
* [info] at scala.concurrent.Future$$anonfun$recover$1.apply(Future.scala:324)
* [info] at scala.concurrent.Future$$anonfun$recover$1.apply(Future.scala:324)
* [info] at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
* [info] at scala.concurrent.impl.ExecutionContextImpl$$anon$3.exec(ExecutionContextImpl.scala:107)
* [info] at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
* [info] at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
* [info] at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
* [info] at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
* [info] Cause: java.lang.Exception: Problem while storing the data.
* [info] at scala.concurrent.FutureStackTraceTest$$anonfun$2$$anonfun$3.applyOrElse(FutureStackTraceTest.scala:60)
* [info] at scala.concurrent.FutureStackTraceTest$$anonfun$2$$anonfun$3.applyOrElse(FutureStackTraceTest.scala:58)
* [info] at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33)
* [info] at scala.util.Failure$$anonfun$recover$1.apply(Try.scala:185)
* [info] at scala.util.Try$.apply(Try.scala:161)
* [info] at scala.util.Failure.recover(Try.scala:185)
* [info] at scala.concurrent.Future$$anonfun$recover$1.apply(Future.scala:324)
* [info] at scala.concurrent.Future$$anonfun$recover$1.apply(Future.scala:324)
* [info] at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
* [info] at scala.concurrent.impl.ExecutionContextImpl$$anon$3.exec(ExecutionContextImpl.scala:107)
* [info] at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
* [info] at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
* [info] at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
* [info] at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
* [info] Cause: java.lang.Exception: Problem in database.
* [info] at scala.concurrent.FutureStackTraceTest$$anonfun$2$$anonfun$12.apply(FutureStackTraceTest.scala:57)
* [info] at scala.concurrent.FutureStackTraceTest$$anonfun$2$$anonfun$12.apply(FutureStackTraceTest.scala:56)
* [info] at scala.util.Success$$anonfun$map$1.apply(Try.scala:206)
* [info] at scala.util.Try$.apply(Try.scala:161)
* [info] at scala.util.Success.map(Try.scala:206)
* [info] at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
* [info] at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
* [info] at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
* [info] at scala.concurrent.impl.ExecutionContextImpl$$anon$3.exec(ExecutionContextImpl.scala:107)
* [info] at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
* [info] at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
* [info] at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
* [info] at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
*/
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment