【问题标题】:scala spark - do not throw exception in retry methodscala spark - 不要在重试方法中抛出异常
【发布时间】:2021-10-26 01:03:08
【问题描述】:
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")
            ^

目标是在失败的情况下不抛出异常。使用上述重试功能如何实现?

【问题讨论】:

  • 好吧,如果所有重试都失败了,您需要以某种方式发出信号吗?也许返回 Option[T] 而不是普通的 T
  • 我正在尝试这样的事情,如果它有效,会通知你 import scala.util.{Try, Success, Failure} def retry[T](n: Int)(fn: => T ): Option[T] = { Try { return Some(fn) } match { case Success(x) => x case Failure(f) => { Thread.sleep(3000) if (n > 1) { retry(n - 1)(fn) } else { 无 } } } }

标签: scala apache-spark exception


【解决方案1】:

以下是您在 cmets 中发布的代码的更新版本:

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 类型;可以认为它根本不返回任何东西,至少不是我们可以引用的任何东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-09
    • 2015-10-28
    • 1970-01-01
    • 2021-02-08
    • 2018-11-10
    • 2018-12-10
    • 2013-02-15
    相关资源
    最近更新 更多