Как упоминал @HristoIliev, ваш метод не может быть хвостовым рекурсивным, потому что вызов finally
не обязательно будет хвостовым вызовом. Это означает, что любой метод, использующий try
таким образом, не будет хвостовой рекурсией. См. также этот ответ.
Повторный вызов метода — это странный способ повторять что-либо до тех пор, пока он не добьется успеха, потому что на каждом этапе он выдает исключение, которое вы, по-видимому, не обрабатываете. Вместо этого я бы предложил использовать функциональный подход с Try
, выбирая ошибки из представления до тех пор, пока операция не завершится успешно. Единственным недостатком этого подхода является то, что он не генерирует никаких исключений, которые вы могли бы обрабатывать по пути (что также может быть преимуществом!).
def tryAll[A](xs: List[A])(f: A => Unit): Unit =
xs.view.map(x => Try(f(x))).takeWhile(_.isFailure).force
scala> val list = List(0, 0, 0, 4, 5, 0)
scala> tryAll(list)(a => println(10 / a))
2
Если вы действительно хотите обрабатывать исключения (или только последнее исключение), вы можете изменить тип возвращаемого значения tryAll
на List[Try[Unit]]
(или просто Try[Unit]
, если вы измените код так, чтобы он принимал только последнее). Лучше, чтобы тип возвращаемого значения метода описывал часть того, что он на самом деле делает — потенциально возвращает ошибки.
person
Michael Zajac
schedule
14.02.2017
finally
не является последним выполняемым кодом. - person Hristo Iliev   schedule 14.02.2017scala.util.Try
для переноса вызовов функций, но я не могу предоставить вам пример кода. - person Hristo Iliev   schedule 14.02.2017