2014-06-12 2 views
3

I이 사용하는이 기능 Play WS services : 스칼라 - 재생 : 잘 처리하는 방법 WS 얻을 예외

case class Url(id: Long, url: String) 

내가 내 응용 프로그램을 원하는 : Url 그렇게 정의 된 경우 클래스입니다

def executeRequest(urls: List[Url]): List[Future[String]] = 
    urls.map(url => { 
     WS.url(url.url).get().map(x => url.url + ": " + x.statusText) 
    }) 

탄력적이어야하며 때로는 url 값은 URL이 잘 형성되지 않은 경우 IllegalArgumentException을 트리거합니다. 예외가 향후 실행 내부의 .get() 내부에 발생하고 있지 않기 때문에

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" 
    }) 
    }) 

이 (어쨌든 그냥 추측) 대부분의 아마 작동하지 않습니다 내가 노력하면이이었다.

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을 추가하지 않았습니다.

답변

3

Try 여기에 당신의 친구입니다.

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에서 오류 메시지가 모든 예외를 대체합니다. 우리는 그것보다 조금 더 정교하게 될 수 있습니다. 아마도 우리는 성공 Future[String]의 같은 잘못된 URL을 유지했지만 실패 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 
) 

또한 future{ .. }의 사용이되지 않습니다 있습니다.

+0

아주 좋은, 감사합니다. –

관련 문제