我有一个从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
  ...
}

10-07 14:17