我有一个从Scala异步调用的Web服务。我想匹配并处理一些特定的故障代码,这些故障代码可以由Web服务在recover
块中返回。
错误返回为包裹在其他异常中的SoapFault
实例,因此从本质上讲,我需要匹配所有异常,其中
原因是SoapFault
的一个实例SoapFault
消息符合我的要求
到目前为止,这是可行的,但很麻烦:
call map { result =>
// handle success
} recover {
case e: Exception if e.getCause != null && e.getCause.isInstanceOf[SoapFault] && e.getCause.asInstanceOf[SoapFault].getMessage == "INVALID_INPUT" => {
// handle error
}
case e: Exception if e.getCause != null && e.getCause.isInstanceOf[SoapFault] && e.getCause.asInstanceOf[SoapFault].getMessage == "SERVER_BUSY" => {
// handle error
}
}
如何以更少的重复更好地做到这一点?
最佳答案
您可以创建自己的Extractor Object。像(未经测试的):
object FaultWithMessage {
def apply(message: String) = new Object() {
def unapply(t: Throwable): Boolean = t match {
case e: Exception if e.getCause != null &&
e.getCause.isInstanceOf[SoapFault] &&
e.getCause.asInstanceOf[SoapFault].getMessage == message => true
case _ => false
}
}
... recover {
case FaultWithMessage("INVALID_INPUT")() =>
//handle that one
case FaultWithMessage("SERVER_BUSY")() =>
//handle that one
...
}