【问题标题】:Catching dangling or unused Futures in Scala在 Scala 中捕获悬空或未使用的期货
【发布时间】:2018-11-28 10:51:38
【问题描述】:

我们的 Scala 代码中的一个常见问题是不会等待返回 Future[T] 的调用(我们通常使用 scala-async 库,因为我们中的许多人都熟悉 C# 中的 async/await)或根本不使用;它被简单地丢弃了。有什么方法可以得到警告,或者是否有 3rd-party 代码分析工具可以捕捉到这个?

显然,这主要适用于“副作用”Futures,例如将对象存储在数据库中。我意识到这可以通过使用更纯粹的函数式方法(例如 IO Monad)来解决,但是为了争论,我们假设我们已经死心地使用内置的 Future。

当(例如)在继续之前成功完成操作至关重要时,这会变得有害。我们的一个常见示例是从消息代理接收消息,将其存储到数据库中,然后只有当该操作完成时,我们才会将消息的接收提交给代理。通常很容易粗心地说:

storeObject()
commitToBroker()

// instead of...
await(storeObject())
await(commitToBroker())

// or...
storeObject().flatMap(_ => commitToBroker())

我们已将此问题称为“悬空未来”,我们的政策是至少任何未来都应该包含一个记录任何错误的andThen()。但是,我们没有自动的方法来发现违反此政策的行为,而且我不知道有一个警告标志会起作用。

【问题讨论】:

  • 你试过scalac开关“-Ywarn-value-discard”吗?

标签: scala future code-analysis static-code-analysis futuretask


【解决方案1】:

我不知道有什么编译器插件可以做到这一点,但我有一些建议:

首先,将 scalac 标志 -Ywarn-unused 与 -Xfatal-warnings 结合使用。这样,每当您返回未使用的 Future 或任何其他值时,您都会收到错误消息。

其次,避免使用内置方法创建 Futures,而是创建自己的构造函数/工厂,以使用默认日志记录策略创建 Futures。

三,为了执行第二点,创建检查和禁止Future {...}、Future.successful 或Future.failure 的scalastyle 规则。

【讨论】:

    猜你喜欢
    • 2014-01-10
    • 2013-07-20
    • 1970-01-01
    • 2016-07-27
    • 2019-09-01
    • 2023-02-16
    • 1970-01-01
    • 2019-07-05
    • 2015-08-08
    相关资源
    最近更新 更多