使用scala中的模式匹配优化错误处理

时间:2018-06-14 08:08:14

标签: scala error-handling

我有一个代码块,如下所示处理一些异常,我使用if-else语句,但我不喜欢它们彼此嵌套,想知道是否可以使用模式匹配使其更好?< / p>

    try {
      if (response.code < 200 || response.code > 299) {
        throw new SearchClientFailure(s"API request failed with code ${response.code}, body ${response.body}")
      } else {
        if (isExceeded(response.body)) {
          throw new SearchClientFailure("Exceed limit")
        } else {
          response.body
        }
      }
    } catch {
      case e: SearchClientFailure =>
        if (queries.isEmpty) {
          throw new SearchClientFailure
        } else {
          logger.warn(s"Failed to update the queries: ${e.message}")
          queries
        }
      case _ =>
        throw new SearchClientFailure
    }

3 个答案:

答案 0 :(得分:2)

你可以这样做:

   response match {
     case r if (r.code < 200 || r.code > 299) => ...
     case r if (isExceeded(r.body)) => ...
     case r => r.body
   }

更好吗?我不是百分百确定,我不喜欢这种风格。

顺便说一下,根据您使用的内容,您经常可以访问response.isSuccess()或response.code.isSuccess()而不是测试代码值

答案 1 :(得分:1)

我倾向于使用Either[String,Response],而不是承担那些短暂投掷和捕获的开销。

Right(response).flatMap{r =>
  if (r.code > 199 && r.code < 300) Right(r)
  else Left(s"API request failed with code ${r.code}, body ${r.body}")
}.flatMap{r =>
  if (isExceeded(r.body)) Left("Exceed limit")
  else Right(r)
}.fold(msg => {
  if (queries.isEmpty) throw new SearchClientFailure
  logger.warn(s"Failed to update the queries: $msg")
  queries
}, _.body)

唯一需要的throw是被抛弃的背景。其他所有内容都在代码流中处理。

答案 2 :(得分:1)

以下是使用<option value="">Choose element</option>

的版本
Either

val apiResult: Either[String, String] = if (response.code < 200 || response.code > 299) Left(s"API request failed with code ${response.code}, body ${response.body}") else if (isExceeded(response.body)) Left("Exceed limit") else Right(response.body) apiResult match { case Right(result) => result case Left(message) if queries.nonEmpty => logger.warn(s"Failed to update the queries: $message") queries case _ => throw new SearchClientFailure } 值存储错误字符串或API调用的正确结果。然后,如果需要,后续匹配可以检索原始错误字符串。

遵循惯例apiResult是正常/成功结果,Right是错误情况或异常结果。