我得到了这个可爱的错误,它在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
这是否代表了一个崩溃的承诺/未来,但除了akka的调度员之外,没有任何线程等待它了?如何在不附加调试器会话的情况下跟踪代码中的错误?
附加调试器,似乎在Future return
组合中使用map
会导致NonLocalReturnControl
错误。奇怪但不幸的是,在我的情况下,堆栈跟踪不会传播到控制台/日志。创建NonLocalReturnControl时的堆栈可以在调试器中看到,但akka / play以某种方式不提供它。
答案 0 :(得分:3)
唉,默认情况下会抑制此类错误的堆栈跟踪。结果令人惊讶的是,scala通过内部抛出和捕获此异常类型在内部实现函数返回值传播(至少在Scala 2.11之前)。因此特别压制......艰难的运气。
在将来使用return
时会出现同样的异常,这显然是一个错误,但内部架构使用这个被抑制的异常,使调试这个特殊情况,好吧,糟透了。如果出现此错误,请检查您是否在异步代码中使用return
,并避免尽可能多地使用return
,以便在异步时将不太可能出现在代码中。