我有一个代码块,如下所示处理一些异常,我使用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
}
答案 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
是错误情况或异常结果。