在我们的Scala,Play,Reactivemongo中,我们遇到异常处理的一个大问题 - 当出现错误时,在Iteratee / Enumeratee或Actor系统Play中只是吞下它,而不会在输出中记录任何错误。所以我们实际上需要猜测可能发生错误的位置和原因。
我们使Globals覆盖,总是打印错误,并指定logger.root=TRACE
,但仍然没有看到输出,我们可以从中分析我们的问题。
如何强制让Play打印所有错误
答案 0 :(得分:1)
没有找到明确记录所有内容的方法,但有一种方法可以在本地记录异常。
我这样做了:
def recover[T] = Enumeratee.recover[T] {
case (e, input) => Logger.error("Error happened on:" + input, e)
}
然后在所有可能产生错误的枚举上使用它
def transform(from: Enumerator[From]): Enumerator[String] = {
heading >>> (from &> recover[From] ><> mapper) >>> tailing
}
这里,mapper抛出异常,它们都被记录下来。
答案 1 :(得分:0)
我认为你的问题在于Future如何在scala中运行,让我们看看以下例子:
val f :Future[Int]= Future {
throw new NullPointerException("NULL")
1
}
f.map(s1 => {println(s" ==> $s1");s" ==> $s1"})
此代码将引发异常,但不会打印堆栈跟踪,因为future会处理错误。
如果您想获得发生的错误,可以 只需致电:
f.onComplete{
case Success(e) => {}
case Failure(e) => e.printStackTrace()
}
e
是一个throwable,您可以使用它来处理错误。
答案 2 :(得分:0)
在我使用的解决方案中,通过Play https://www.playframework.com/documentation/2.4.2/ScalaErrorHandling中的ErrorHandling覆盖,基本上创建了记录所有错误的ErrorHandler,并且需要使用detalization。