#scala #apache-spark #exception
Вопрос:
import scala.util.{Try, Success, Failure}
def retry[T](n: Int)(fn: => T): T = {
Try {
return fn
} match {
case Success(x) => x
case Failure(f) => {
Thread.sleep(3000)
if (n > 1) {
retry(n - 1)(fn)
} else {
//custom error handling - dont throw exception
println("error")
}
}
}
}
При компиляции описанного выше метода повторной попытки он возвращает приведенную ниже ошибку
error: type mismatch;
found : Unit
required: T
println("error")
^
Цель состоит в том, чтобы не создавать исключения в случае сбоя. Как этого можно достичь с помощью описанной выше функции повтора?
Комментарии:
1. Ну, а если все повторные попытки не увенчались успехом, вам нужно как-то это сигнализировать? Может быть, вернуть
Option[T]
вместо простогоT
2. Я пытаюсь сделать что-то подобное, буду держать вас в курсе, если это сработает, импортируйте scala.util. {Попытка, успех, сбой} повторная попытка[T](n: Int)(fn: => T): Опция[T] = { Попытка { вернуть некоторые(fn) } совпадение { случай успеха(x) =>> x случай неудачи(f) =>>> { Поток.спящий режим(3000) если (n >>>> 1) { повторная попытка(n — 1)(fn) } еще { Нет } } } }
Ответ №1:
Ниже приведена обновленная версия кода, которую вы опубликовали в комментариях:
import scala.util.{Try, Success, Failure}
def retry[T](n: Int)(fn: => T): Option[T] = {
Try(fn) match {
case Success(x) => Some(x)
case Failure(f) => {
Thread.sleep(3000)
if (n > 1) {
retry(n - 1)(fn)
} else {
println(f)
None
}
}
}
}
Что я изменил?
Где ты был:
Try { return Some(fn) } match { }
Я изменился на:
Try(fn) match { }
Это связано с тем, что мы не должны возвращаться сюда, а вместо этого проверять, не возникло ли fn
исключение. Так как мы не возвращаемся, нам не нужно оборачиваться Some
.
case Success(x) => x
это сейчас:
case Success(x) => Some(x)
Это необходимо для удовлетворения возвращаемого типа Option[T]
else { None }
это сейчас:
else {
println(f)
None
}
Это было основано на том, что вы упомянули в вопросе: « //custom error handling - dont throw exception
» и println("error")
.
Вместо этого я печатаю f
, в котором будет содержаться конкретная информация об ошибке для возникшего исключения.
Что ты видел error: type mismatch
?
Это было потому println
, что возвращает Unit
тип; можно подумать, что он вообще ничего не возвращает, по крайней мере, ничего, на что мы можем ссылаться.