我正在写Scala的微服务,我正在处理来自服务器的响应,通过抛出不同的异常来处理错误。如何通过一个例外,在默认的“原因”作为函数参数斯卡拉
错误处理对于每个错误基本相同,记录警告消息并抛出异常。唯一改变的是我生成的自定义异常,所以我不想在我的“case”语句中重复相同的代码,因此我决定使用一个方法,接受异常作为参数。
config.httpClient.apply(request).map(response => {
response.getStatusCode() match {
case Status.Ok.code =>
<Do stuff to process the response>
case Status.BadRequest.code =>
errorReporting(response.status.code, response.contentString, BadRequestException)
case Status.Unauthorized.code =>
errorReporting(response.status.code, response.contentString, UnauthorizedException)
case _ =>
errorReporting(response.status.code, response.contentString, GeneralException)
}
})
例外被定义为case类:
case class GeneralException(private val message: String,
private val cause: Throwable = None.orNull) extends Exception (message, cause)
case class BadRequestException(private val message: String,
private val cause: Throwable = None.orNull) extends Exception(message, cause)
case class UnauthorizedException(private val message: String,
private val cause: Throwable = None.orNull) extends Exception(message, cause)
而且ERRORREPORTING方法在这里:
def errorReporting(errorCode: Int, errorMessage: String, ex: (String, Throwable) => Throwable) = {
val message = s"Auth server response code: ${errorCode}, " + errorMessage
warn(message)
throw ex(message, None.orNull)
}
我与 “事业” 定义默认值我的异常。问题是,我没有找到一种方法来告诉“errorReporting”Throwable是一个可选参数,因此我不得不抛出异常throw ex(message, None.orNull)
,我不觉得很优雅。
此条目Invocation of methods with default parameters in scala higher-order function告诉我不能将默认参数传递给高阶函数。
有没有其他方法可以更好地解决这个问题?
的情况下,也许这个问题是有用的给你:https://stackoverflow.com/questions/11982474/case-classes-with-optional-fields- in-scala/11982762 –
'None.orNull'是编写'null'的好方法。对于可选参数,使用'cause:Option [Throwable] = None' –
@ T.Grottker没有解决我的问题,仍然有用。谢谢! – Visiedo