2013-09-29 6 views
5

में भविष्य में होने वाले अपवाद को कैसे संभालें I play playwork में एक नियंत्रक विधि लिख रहा हूं जो एक फ़ंक्शन कहता है जो एक अपवाद फेंक सकता है। मुझे उस अपवाद को पकड़ने और संभालने के तरीके को समझने में परेशानी हो रही है।स्कैला

यहाँ मैं क्या करने की कोशिश की है:

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 एपीआई से कार्य है।

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]] 

मेरा प्रश्न है मैं कैसे को पकड़ने और संभाल कि मेरे नियंत्रक विधि में इन अपवादों?

उत्तर

10

आप इस तरह Future बजाय Try की recover विधि का उपयोग करना चाहिए:

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

Try मामले verifiedId में आपकी मदद कर सकता Future लौटने के बजाय एक अपवाद फेंकता है। आपके मामले में verifiedId सफलतापूर्वक Future लौटाता है (भले ही Future में कोई अपवाद होगा)।

+0

धन्यवाद - मैंने पुनर्प्राप्ति की तलाश की लेकिन पार्टियल फंक्शन की अवधारणा को समझ में नहीं आया। आपके उदाहरण ने मेरे लिए अवधारणा को काम किया और स्पष्ट किया। –

+0

@ KresimirNesek: 'PartialFunction' (और पैटर्न मिलान) स्कैला में सबसे महत्वपूर्ण और उपयोगी टूल में से एक है। '9 देखें। [स्कैला टैग जानकारी] में पैटर्न मिलान 'अनुभाग (http://stackoverflow.com/tags/scala/info)। – senia