首页 > 解决方案 > 如何在scala中打印catch表达式中的失败索引?

问题描述

我有一个看起来像这样的代码:

  import scala.util.{Try, Success, Failure}
  Try(
    for (i <- 1 to 1000) {
      doSomething(df(i))
    }
  ) match {
    case Success(t) => println(s"success")
    case Failure(t)  => println(s"failure")

  }

我想打印失败输入的索引。如何在 catch 表达式中打印索引 i?

标签: scalaerror-handling

解决方案


您可以使用Cats来代替:

import scala.util.Try
import cats.implicits._

(1 to 1000).traverse(i => Try(doSomething(df(i))).toEither.left.map(ex => (ex, i))) match {
  case Right(_)      => println("success")
  case Left((ex, i)) => println(s"failure: ${ex.getMessage} on idx: ${i}")
}

如果您不想使用Cats,您可以:

val attempts = for {
  i <- Stream.range(start = 1, end = 1000) // Thanks to Bogdan for the idea of using a Stream.
} yield Try(doSomething(df(i))).toEither.left.map(ex => (ex, i))

attempts.collectFirst { case Left((ex, i)) => ex -> i } match {
  case None          => println("success")
  case Some((ex, i)) => println(s"failure: ${ex.getMessage} on idx: ${i}")
}

推荐阅读