我有一个控制器,它将方法公开为路径。在这个方法中,我调用一个长时间运行的计算,返回Future [SomeType]。
我现在有以下内容:
def compute(id: String) = Action.async { request =>
val result: Future[SomeType] = compute(id)
result.map(value => Ok(transform(value, id)))
}
到目前为止,这只是一条快乐的道路。如果compute(id)导致失败怎么办?怎么处理?我可以用Try块包装整个东西,但有更好的选择吗?有什么建议吗?
答案 0 :(得分:3)
我们通常使用以下模式:
def compute(id: String) = Action.async { request =>
val result: Future[SomeType] = compute(id)
result.map(value => Ok(transform(value, id)))
.recover { case ex =>
Logger.error("Something went wrong", ex)
InternalServerError
}
}
这样,HTTP响应代码将为500 INTERNAL SERVER ERROR
,因此将通知呼叫者。您可能还想在请求的参数上添加验证并返回400 BAD REQUEST
等。