ИМО вопрос намекает на то, что код врет.
Вы можете написать код по-другому:
import scala.util.{Try, Success, Failure}
for (i <- 1 to 1000) {
Try(
doSomething(df(i))
) match {
case Failure(t) => println(s"failure on $i")
case _ =>
}
}
Но ты не хочешь. Почему бы и нет? Потому что вы хотите остановить итерацию после первого сбоя. Но вы используете цикл от 1 до 1000. На самом деле вы не собираетесь делать все 1000 итераций. Вы используете исключение, чтобы разорвать цикл for.
Я бы переписал этот код, чтобы было ясно, что я не собираюсь явно повторять весь диапазон.
Вы можете, например, использовать find вместо for, чтобы найти индекс, который вызывает сбой. если ничего не найдено -> все прошло успешно.
так что-то похожее (не проверено):
(1 to 1000).indexWhere{index=>Try{doSomething(index)}.isFailure
Я не уверен, найден ли он или где-то в Scala, но вы поняли.
если вы также хотите получить исключение, а не только индекс, вы можете использовать представления (https://docs.scala -lang.org / Overviews / collection / views.html ), чтобы изменить свою последовательность на лениво оцененный, сопоставьте список с кортежем формы (index, Try) (без итерации всей коллекции, из-за ленивости результата .view), а затем collectFirst, где вторым элементом кортежа является Failure.
так что-то вроде (не проверено):
(1 to 1000).view.map{index => (index, doSomething(index)}.collectFirst{case (i,Failure(e)) => println(s"error was $e at index $i")}
в качестве альтернативы вы могли бы написать очень маленькую рекурсию для итерации последовательности индекса (также не проверенной)
def findException(indexes: Seq[Int]): Option[(Int, Exception)] = indexes match {
case Nil => None
case index+:remaining =>
Try(doSomething(i)) match {
case Success(_) => findException(remaining)
case Failure(e) => Option((index,e))
}
findException(1 to 1000).map(println)
один вопрос: как вы определили от 1 до 1000?
этот вопрос выглядел бы иначе, если бы у вас был набор элементов для проверки, а не диапазон. в этом случае вы, вероятно, просто использовали бы foldLeft.