在Scala中捕捉悬空或未使用的期货

时间:2018-06-19 12:53:57

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

Scala代码中的一个常见问题是将不会等待返回Future[T]的调用(我们通常使用scala-async库,因为我们很多人都熟悉C#的异步/等待)或完全使用;它只是被丢弃。有什么方法可以得到警告,或者有第三方代码分析工具可以捕获此警告?

显然,这主要适用于“附带影响”的期货,例如将对象存储在数据库中。我意识到可以通过使用诸如IO Monad之类的更纯粹功能的方法来解决此问题,但让我们假设出于争论的缘故,我们始终坚持使用内置的Future。

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

storeObject()
commitToBroker()

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

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

我们已将此问题称为“悬而未决的未来”,并且我们有一项政策,即至少任何未来都应包括记录任何错误的andThen()。但是,我们没有自动的方法来捕获违反此政策的情况,并且我不知道会有一个警告标志会起作用。

1 个答案:

答案 0 :(得分:0)

我不知道会执行此操作的编译器插件,但是我有一些建议:

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

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

第三,要强制执行第二点,请创建scalastyle规则以检查并禁止Future {...}Future.successfulFuture.failure