2013-09-29 32 views
5

Yürütme çerçevesinde bir Özel Durum atabilen bir Gelecek döndüren bir işlevi çağıran bir denetleyici yöntemi yazıyorum. Bu İstisna'yı nasıl yakalayacağımızı ve ele alacağımı bulmakta zorlanıyorum.Scala'da bir gelecekte gerçekleşecek bir özel durum nasıl ele alınır

İşte denedim ne:

def openIDCallback = Action { implicit request => 
    Async (
     Try(OpenID.verifiedId) match { 
     case Failure(thrown) => { 
      PurePromise(Ok("failed: " + thrown)) 
     } 
     case Success(successResult) => { 
      successResult.map(userInfo => { 
      Ok(userInfo.id + "\n" + userInfo.attributes) 
      }) 
     } 
     } 
    ) 
    } 

OpenID.verifiedId Gelecek [Userınfo] döndüren Play'in OpenId API gelen fonksiyonudur. Yukarıda gösterildiği gibi, işlev PurePromise (Errors.AUTH_CANCEL atmak) ve PurePromise (Errors.BAD_RESPONSE atmak) dönebilirsiniz

def verifiedId(queryString: Map[String, Seq[String]]): Future[UserInfo] = { 
    (queryString.get("openid.mode").flatMap(_.headOption), 
     queryString.get("openid.claimed_id").flatMap(_.headOption)) match { // The Claimed Identifier. "openid.claimed_id" and "openid.identity" SHALL be either both present or both absent. 
     case (Some("id_res"), Some(id)) => { 
     // MUST perform discovery on the claimedId to resolve the op_endpoint. 
     val server: Future[OpenIDServer] = discovery.discoverServer(id) 
     server.flatMap(directVerification(queryString))(internalContext) 
     } 
     case (Some("cancel"), _) => PurePromise(throw Errors.AUTH_CANCEL) 
     case _ => PurePromise(throw Errors.BAD_RESPONSE) 
    } 
    } 

: İşte bu işlevin kaynağıdır. çözüme Benim girişimi doğru başarıları kolları, ama istisnalarla ilgili alıyorum:

play.api.Application$$anon$1: Execution exception[[AUTH_CANCEL$: null]] 

Sorum benim denetleyicisi yönteminde bu istisnalar nasıl yakalamak ve hallediyorsunuz edilir?

Async (
    OpenID.verifiedId. 
    map{userInfo => Ok(userInfo.id + "\n" + userInfo.attributes)}. 
    recover{ case thrown => Ok("failed: " + thrown) } 
) 

Try durumda verifiedId size yardımcı olabilir Future dönen yerine bir istisna atar:

cevap

10

Böyle Future yerine Try ait recover yöntemi kullanmalısınız. Sizin durumunuzda verifiedId başarıyla Future döndürür (bu Future bir istisna olacak olsa bile).

+0

Teşekkürler - İyileştirmeyi araştırdım ama Kısmi İşlev kavramını anlamadım. Örneğiniz benim için konseptini çalıştı ve açıkladı. –

+0

@KresimirNesek: 'PartialFunction' (ve desen eşleşmesi), scala'daki en önemli ve kullanışlı araçlardan biridir. 9'a bakın. [Scala etiket bilgisi] 'deki desen eşleştirme' bölümü (http://stackoverflow.com/tags/scala/info). – senia