繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM