【发布时间】: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