Stackless Scala 播放框架运行时错误

Stackless Scala play framework runtime error

我遇到了这个可爱的错误,它在 play 的日志文件(也不在控制台)中没有与之关联的堆栈跟踪。

[ERROR] [03/14/2015 19:36:46.713] [play-akka.actor.default-dispatcher-7] [ActorSystem(play)] Uncaught error from thread [play-akka.actor.default-dispatcher-7] (scala.runtime.NonLocalReturnControl)
[error] a.a.ActorSystemImpl - Uncaught error from thread [play-akka.actor.default-dispatcher-7]
scala.runtime.NonLocalReturnControl: null

这是否表示 promise/future 崩溃了,但除了 akka 的调度程序之外没有线程在等待它?我如何在不附加调试器会话的情况下跟踪代码中的错误?

附加调试器,似乎在 Future map 组合中使用 return 导致了 NonLocalReturnControl 错误。奇怪而不幸的是,在我的例子中,堆栈跟踪不会传播到 console/log 。在调试器中可以看到创建 NonLocalReturnControl 时的堆栈,但是 akka/play 不知何故不提供它。

唉,这种错误的堆栈跟踪在默认情况下是被抑制的。令人惊讶的是,scala 通过内部抛出和捕获此异常类型(至少直到 Scala 2.11)在内部实现函数 return 值传播。因此特别压制……倒霉。

将来使用 return 时会出现同样的异常,这显然是一个错误,但是内部架构使用这个被抑制的异常,使得调试这个特殊情况,好吧,糟透了。如果出现此错误,请检查您是否没有在异步代码中使用 return,并尽可能避免使用 return,这样当转为异步时,它不太可能在您的代码中弹出。