Web services Scala-Play:如何很好地处理WS-get异常

Web services Scala-Play:如何很好地处理WS-get异常,web-services,scala,http,playframework,Web Services,Scala,Http,Playframework,我有这个功能,它使用: 其中Url是这样定义的案例类: case class Url(id: Long, url: String) 我希望我的应用程序具有弹性,如果url格式不正确,有时url值会触发IllegalArgumentException。我尝试的是: def executeRequest2(urls: List[Url]): List[Future[String]] = urls.map(url => { WS.url(url.url).get().map(x =

我有这个功能,它使用:

其中
Url
是这样定义的案例类:

case class Url(id: Long, url: String)
我希望我的应用程序具有弹性,如果url格式不正确,有时
url
值会触发
IllegalArgumentException
。我尝试的是:

def executeRequest2(urls: List[Url]): List[Future[String]] =
  urls.map(url => {
    WS.url(url.url).get().map(x => url.url + ": " + x.statusText )
    .recover({
      case e: IllegalArgumentException => url.url + " is invalid"
    })
  })
这不起作用,很可能是因为异常是在
.get()
中抛出的,而不是在将来的执行中抛出的(反正这只是一个猜测)

我最后做的是:

def executeRequest(urls: List[Url]): List[Future[String]] =
  urls.map(url => {
    try {
      WS.url(url.url).get().map(x => x.statusText)
    }
    catch {
      case e: IllegalArgumentException => future {
        url.url + " is illegal."
      }
    }
  })

这是可行的,但我希望有更好、更惯用的方法来处理这个异常。请注意,这里我没有添加
recover
来处理将来执行中的最终问题,这将使这段代码更加难以辨认

试试看
是你的朋友吗

import scala.util.Try

urls.map(url => 
    Try(WS.url(url.url).get().map(x => x.statusText))
        .getOrElse(Future.successful(url.url + " is illegal."))
)
这将用
getOrElse
中的错误消息替换所有异常。不过,我们可以做得更精细一些。也许我们可以将无效URL保持为成功的
Future[String]
s,但将所有其他URL转换为失败的
Future
s

urls.map(url => 
    Try(WS.url(url.url).get().map(x => x.statusText))
        .recover{case e: IllegalArgumentException => Future.successful(url.url + " is illegal.")}
        .recover{case t: Throwable => Future.failed(t)}
        .get
)
还请注意,不推荐使用
future{..}

urls.map(url => 
    Try(WS.url(url.url).get().map(x => x.statusText))
        .recover{case e: IllegalArgumentException => Future.successful(url.url + " is illegal.")}
        .recover{case t: Throwable => Future.failed(t)}
        .get
)