首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >捕获Scala期货中未处理的错误

捕获Scala期货中未处理的错误
EN

Stack Overflow用户
提问于 2013-12-22 12:20:29
回答 2查看 3K关注 0票数 7

如果Scala未来失败,并且没有“观察”失败的延续(或者唯一的连续使用map/flatMap,并且在失败时不运行),那么错误就不会被检测到。我希望这样的错误至少被记录下来,这样我才能找到bug。

我使用“观察错误”一词,因为在.Net任务中,当GC收集任务对象时,有机会捕获“未观察的任务异常”。类似地,对于同步方法,可以记录终止线程的未捕获异常。

在Scala未来中,“观察”故障意味着某些延续或其他代码在释放未来值之前读取存储在未来值中的异常。我知道,终结是不确定的或不可靠的,这大概就是为什么它不用于捕获未处理的错误,尽管.Net确实成功地做到了这一点。

有没有办法在Scala中实现这一点?如果没有,我应该如何组织我的代码以防止未处理的错误错误?

今天,我把andThen checkResult附加到了各种期货。但是很难知道什么时候使用它,什么时候不使用:如果库方法返回一个未来,它本身不应该是checkResult和日志错误,因为库用户可能处理失败,所以责任落在用户身上。当我编辑代码时,我有时需要添加检查,有时需要删除它们,这样的手动管理肯定是错误的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-08 19:50:47

我的结论是,没有办法一般性地注意Scala期货中未处理的错误。

票数 7
EN

Stack Overflow用户

发布于 2013-12-23 10:55:44

您只需在返回未来的函数中使用Future.recover

例如,您可以“记录”错误并在最简单的情况下重新抛出原始异常:

代码语言:javascript
运行
复制
def libraryFunction(): Future[Int] = {
   val f = ...
   f.recover {
      case NonFatal(t) =>
         println("Error : " + t)
         throw t
   }
}

注意,使用NonFatal来匹配所有可以捕获的异常类型。

如果您愿意的话,恢复块同样可以返回另一个结果。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20729314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档