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
)