我有以下代码:
private def getAPIResult(token: String, apiCall: String):Future[JsValue] = {
WS.url(apiCall)
.withHeaders("Authorization" -> ("Bearer " + token))
.get().map(response =>
response.status match {
case 200 => Json.parse(response.body)
case 401 => throw new RuntimeException("Authorization failed, we really need to handle this: " + response.body)
case _ => throw new RuntimeException("Web service call failed: " + response.body)
}
)
}
我需要处理两个失败案例 - 一个是我获得HTTP 401响应,另一个是其他更通用的错误。
我确信我已经读过在函数式编程中抛出异常是“不好的做法”,但这就是我在这里做的事情吗?我不是在将来失败吗?
我需要能够处理401响应,因此我正在考虑创建一个新的Exception类(称为UnauthorizedException),以便调用getApiResult
的方法可以区分401和任何其他错误。在我这样做之前,我想确保使用这样的例外被认为是一种很好的做法,或者如果有更好的方法可以做到这一点。
答案 0 :(得分:0)
我确定我已经读过它的不良做法'在函数式编程中抛出异常,但这就是我在这里做的事情吗?我真的只是未来失败了吗?
失败的未来只是一个价值。抛出异常通常被认为是一种不好的做法,因为它没有表现得像返回一个值。
我需要能够处理401响应,因此我正在考虑创建一个新的Exception类(称为UnauthorizedException),以便调用getApiResult的方法可以区分401和任何其他错误。在我这样做之前,我想确保使用这样的例外被认为是一种很好的做法,或者如果有更好的方法可以做到这一点。
是的,完全没问题。一个问题是,从签名中可以明显看出UnauthorizedException需要单独处理。
对于私有 API,这很重要。如果您仍想避免它,您可以执行类似
的操作sealed trait Response
case class Ok(value: JsValue) extends Response
case class Unauthorized extends Response
// possible
case class OtherError(e: Exception) extends Response
private def getAPIResult(token: String, apiCall: String):Future[Response] = ...
但当然,现在所有客户都必须处理它。