scala - 如何正确处理 Future.sequence 中的个别异常?
问题描述
假设我有一个从服务器下载文件并将它们上传到另一台服务器的应用程序。
下载文件不一定存在于服务器上。
因此,当文件不存在时,我想跳过它,而不是继续上传它并确保只下载/上传现有文件。(即没有一个下载异常应该停止所有其他下载和上传过程)
未来应该成功但没有结果(单位)或失败并出现异常以及失败的路径。
处理这种情况的标准方法是什么?
def downloadFile(path: String): Future[DownloadFile]
def uploadFile(file: DownloadFile): Future[Unit]
Future.sequence(
paths.map { path =>
for {
downloadedFile <- downloadFile(path)
_ <- uploadFile(downloadedFile)
} yield Unit
}
)
解决方案
考虑
val listOfFutures = List(
Future(1),
Future(throw new RuntimeException("path/foo")),
Future(2),
Future(throw new RuntimeException("path/bar")),
)
Future.traverse(listOfFutures)(_.transform {
case Success(v) => Try(Some(v))
case Failure(e) => Try(None)
}).map(_.flatten) andThen { case v => println(v) }
哪个输出
Success(List(1, 2))
NoteFuture.sequence
是一个更简单的版本Future.traverse
。
应用评论,考虑像这样反转展平
Future.traverse(listOfFutures)(_.transform {
case Success(v) => Try(None)
case Failure(e) => Try(Some(e.getMessage))
}).map { results =>
if (results.flatten.nonEmpty) throw new RuntimeException(s"Bad paths: ${results.flatten.mkString(",")}")
else ()
} andThen { case v => println(v) }
哪个输出
Failure(java.lang.RuntimeException: Bad paths: path/foo,path/bar)
推荐阅读
- python - 你怎么能解决这个问题AttributeError:'scipy'对象(scipy)没有属性'misc'?
- reactjs - Material UI - 表格分页是从零开始的索引,如何使其非零
- python-3.x - 来自python chromeos linux的损坏的视觉效果
- javascript - 我想从 jquery 中的该数组对象中删除双引号
- node.js - 使用 Redis 缓存与用户会话相关联的 API 数据
- php - 使用 PHP 更改按钮单击时的输入值
- python - 在 Visual Studio 代码上设置 python 的问题
- angular - 所有 Angular 单元测试都因“非法状态:无法加载指令摘要 ....”而出错
- r - 向量化 R 代码,已经使用序列符号
- sql - teradata 中数据值为 0 时缺少行