如何通过内部函数对 Action 函数进行 return 异常处理?

How to return exception to Action function through an inside function?

我有一个简单的动作函数:

def someActionFunc() = Action.async { request =>

 myService.doSomething1().map { res =>
        logger.debug(res.getMessageId)
        Ok(res.getMessageId)
      }.recover {
        case ex =>
          logger.error(s"fail:", ex)
          BadRequest(s"fail with error: ${ex.getMessage}")
      }
}

doSomething1 return 是一个 Future,在 doSomething1 中我正在调用一些其他函数 doSomething2 return 一些对象并且那里发生了异常,但我不知道如何将 return 中发生的错误 doSomething2doSomething1 到操作函数 (someActionFunc) 因为我想return 用户 fail with error: my reason

所以我在 doSomething2 尝试做类似的事情:

def doSomething2(someCondition: Boolean) = {
      if (someCondition){
        throw new RuntimeException("my reason")
      }
    }

但是我被抛出,我怎样才能return正确地向用户抛出操作函数的错误?

在 Scala 中,Future[T] 实际上只是一个 Try[T] that takes some time to complete. In turn, a Try[T] can only be a Success[T] or Failure[T] - where a Failure[T] 实际上只是异常的包装器。

你的错误处理链不工作的原因是你绕过了 Scala 的函数式处理风格(完全基于 来自函数 return 的值 )而是使用 Java-style throw 习语 - 这当然在 JVM 中仍然有效,但不是 Scala-idiomatically.

如果你这样重写doSomething2

def doSomething2(someCondition: Boolean):Future[Int] = {
  if (someCondition){
    Future.failed(new RuntimeException("my reason"))
  } else {
    Future.succesful(42)
  }
}

您将获得您正在寻找的惯用 Scala error-handling。

一些注意事项:

  • 我在 Future 对象 上使用 failed()successful() 方法来方便地围绕我可能的结果构建必要的包装器
  • 虽然我创建一个Exception实例,但我从来没有throw
  • 我已经明确说明了doSomething2的return类型,以帮助编译器确保正确性——之前doSomething2的return类型是什么? Unit?