加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:54:41 所属栏目:安全 来源:网络整理
导读:如果 Scala未来失败,并且没有“观察”失败的延续(或者唯一的延续使用map / flatMap并且在失败的情况下不运行),那么错误就不会被检测到.我希望至少记录这些错误,所以我可以找到错误. 我使用术语“观察到的错误”,因为在.Net Tasks中,当GC收集Task对象时,有机
如果 Scala未来失败,并且没有“观察”失败的延续(或者唯一的延续使用map / flatMap并且在失败的情况下不运行),那么错误就不会被检测到.我希望至少记录这些错误,所以我可以找到错误.

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

在Scala期货中,“观察”失败意味着某些延续或其他代码会在未来处置之前读取存储在未来值中的Exception.我知道最终确定不是确定性的或可靠的,并且可能这就是为什么它不能用于捕获未处理的错误,尽管.Net确实成功地做到了这一点.

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

今天我有,然后检查结果附加到各种未来.但是很难知道何时使用它以及何时不使用:如果库方法返回Future,它不应该checkResult并记录错误本身,因为库用户可能会处理失败,因此责任落在用户身上.当我编辑代码时,我有时需要添加检查,有时需要删除它们,这种手动管理肯定是错误的.

解决方法

您可以在返回Future的函数中使用Future.recover.

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

def libraryFunction(): Future[Int] = {
   val f = ...
   f.recover {
      case NonFatal(t) =>
         println("Error : " + t)
         throw t
   }
}

注意使用NonFatal来匹配捕获的合理的所有异常类型.如果您愿意,那个恢复区块可以同样返回替代结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读