[英]Confused about exception throwing in failed Scala futures
我有以下代码:
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错误和其他任何错误。 不过,在执行此操作之前,我想确保使用这样的异常被认为是一种好的做法,或者是否有更好的方法可以这样做。
我确定我已经读过在函数式编程中引发异常是“错误的做法”,但这是我在这里做的事情吗? 我不是只是在失败的未来?
失败的未来只是一种价值。 抛出异常通常被认为是不好的做法,因为它不表现得像返回一个值。
我需要能够处理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] = ...
但是,当然,现在所有客户都必须处理它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.