2013-09-29 12 views
5

私は、例外を投げる可能性のある未来を返す関数を呼び出すコントローラフレームワークのコントローラメソッドを作成しています。私はその例外をキャッチして処理する方法を理解するのに問題があります。今後スケーラで起こる例外を処理する方法

ここに私が試したものです:

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は今後[のUserInfo]を返すプレイのOpenID APIからの機能です。ここではその関数のソースです:

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

上に示したように、関数はPurePromise(Errors.AUTH_CANCELを投げる)とPurePromiseを(Errors.BAD_RESPONSEを投げる)を返すことができます。ソリューションでの私の試みは正確に成功を処理しますが、私が得る例外で:

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

を私の質問はどのように私は私のコントローラメソッドでこれらの例外をキャッチして扱うんですか?

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

TryはケースverifiedIdであなたを助けることができるFutureを返す代わりに例外をスロー:

答えて

10

あなたはこのようFuture代わりのTryrecover方法を使用する必要があります。あなたの場合、verifiedIdは、Futureに例外がある場合でも、Futureを正常に返します。

+0

ありがとうございました - 私は回復を検討しましたが、PartialFunctionの概念を理解していませんでした。あなたの事例は私のために働き、明確になっています。 –

+0

@KresimirNesek: 'PartialFunction'(パターンマッチング)は、スカラで最も重要で有用なツールの1つです。 '9を参照してください。 [Scala tag info](http://stackoverflow.com/tags/scala/info)のパターンマッチングセクションを参照してください。 – senia

関連する問題