如何通过内部函数对 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 中发生的错误 doSomething2
到 doSomething1
到操作函数 (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
?
我有一个简单的动作函数:
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 中发生的错误 doSomething2
到 doSomething1
到操作函数 (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
?