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:
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ı. –
@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