gpt4 book ai didi

scala - 在 Scala 中如何包装一个 PartialFunction?

转载 作者:行者123 更新时间:2023-12-01 11:33:59 24 4
gpt4 key购买 nike

在 scala 中,Futures 有一种采用 PartialFunction 的救援函数。如果 Future 通过响应解决,则跳过此代码,但如果发生故障,则会调用此代码。

我想简单地将部分函数包装在一个始终执行写入统计计数器的代码的代理中。起初我想我会创建另一个 PartialFunction 但很快意识到它不能很好地与 isDefined 一起工作,然后应用,因为我真的希望每次都调用它。

如何代理 PartialFunction,以便在 Future 出现异常时始终调用我的代码?

最佳答案

总结评论:您可以使用 onFailure 回调在 Future 失败时执行一些副作用代码(日志记录)。

val future = Future(1 / 0)

future.onFailure {
case _ => println("I have seen the Future, and it doesn't look good.")
}

正如@cmbaxter 指出的那样,您还可以在 Future 上使用 andThen,它接受 PartialFunction[Try[A], B]并返回原始 Future。因此,您可以使用 andThen 应用副作用函数,然后再使用 recover。您甚至可以将它们链接多次。

Future(1 / 0)
.andThen { case Failure(_) => println("Future failed.") }
.recover { case e: ArithmeticException => 0 }
.andThen { case Failure(_) => println("Tried to recover, and still failed.") }

或者总是包含它的助手:

object FutureLogger {
def apply[A](a: => A): Future[A] = Future(a).andThen {
case Failure(_) => println("FAILURE")
}
}

关于scala - 在 Scala 中如何包装一个 PartialFunction?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29418830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com