scala spark — не создавайте исключение при повторной попытке

#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 тип; можно подумать, что он вообще ничего не возвращает, по крайней мере, ничего, на что мы можем ссылаться.