如果Scala未来失败,并且没有“观察”失败的延续(或者唯一的连续使用map/flatMap,并且在失败时不运行),那么错误就不会被检测到。我希望这样的错误至少被记录下来,这样我才能找到bug。
我使用“观察错误”一词,因为在.Net任务中,当GC收集任务对象时,有机会捕获“未观察的任务异常”。类似地,对于同步方法,可以记录终止线程的未捕获异常。
在Scala未来中,“观察”故障意味着某些延续或其他代码在释放未来值之前读取存储在未来值中的异常。我知道,终结是不确定的或不可靠的,这大概就是为什么它不用于捕获未处理的错误,尽管.Net确实成功地做到了这一点。
有没有办法在Scala中实现这一点?如果没有,我应该如何组织我的代码以防止未处理的错误错误?
今天,我把andThen checkResult附加到了各种期货。但是很难知道什么时候使用它,什么时候不使用:如果库方法返回一个未来,它本身不应该是checkResult和日志错误,因为库用户可能处理失败,所以责任落在用户身上。当我编辑代码时,我有时需要添加检查,有时需要删除它们,这样的手动管理肯定是错误的。
发布于 2014-01-08 19:50:47
我的结论是,没有办法一般性地注意Scala期货中未处理的错误。
发布于 2013-12-23 10:55:44
您只需在返回未来的函数中使用Future.recover。
例如,您可以“记录”错误并在最简单的情况下重新抛出原始异常:
def libraryFunction(): Future[Int] = {
val f = ...
f.recover {
case NonFatal(t) =>
println("Error : " + t)
throw t
}
}注意,使用NonFatal来匹配所有可以捕获的异常类型。
如果您愿意的话,恢复块同样可以返回另一个结果。
https://stackoverflow.com/questions/20729314
复制相似问题