Scala代码中的一个常见问题是将不会等待返回Future[T]
的调用(我们通常使用scala-async库,因为我们很多人都熟悉C#的异步/等待)或完全使用;它只是被丢弃。有什么方法可以得到警告,或者有第三方代码分析工具可以捕获此警告?
显然,这主要适用于“附带影响”的期货,例如将对象存储在数据库中。我意识到可以通过使用诸如IO Monad之类的更纯粹功能的方法来解决此问题,但让我们假设出于争论的缘故,我们始终坚持使用内置的Future。
当(例如)在继续操作之前成功完成操作至关重要时,这变得有害。对于我们来说,一个常见的示例是从消息代理接收消息,将消息存储到数据库中,然后只有在该操作完成后,我们才将消息的接收提交给代理。通常,很容易不经意地说:
storeObject()
commitToBroker()
// instead of...
await(storeObject())
await(commitToBroker())
// or...
storeObject().flatMap(_ => commitToBroker())
我们已将此问题称为“悬而未决的未来”,并且我们有一项政策,即至少任何未来都应包括记录任何错误的andThen()
。但是,我们没有自动的方法来捕获违反此政策的情况,并且我不知道会有一个警告标志会起作用。
答案 0 :(得分:0)
我不知道会执行此操作的编译器插件,但是我有一些建议:
首先,将scalac标志-Ywarn-unused
与-Xfatal-warnings
结合使用。这样,只要您返回未使用的Future或任何其他值,都会收到错误消息。
第二,避免使用内置方法创建Futures,而是创建自己的构造函数/工厂,以使用默认的日志记录策略创建Futures。
第三,要强制执行第二点,请创建scalastyle规则以检查并禁止Future {...}
,Future.successful
或Future.failure
。