对于失败的Scala期货抛出异常感到困惑

时间:2014-08-17 04:47:35

标签: scala

我有以下代码:

  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和任何其他错误。在我这样做之前,我想确保使用这样的例外被认为是一种很好的做法,或者如果有更好的方法可以做到这一点。

1 个答案:

答案 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] = ...

但当然,现在所有客户都必须处理它。