2013-08-15 12 views
28

के अपवाद को मानचित्र करें mapException स्केल में विफल रहा है?असफल भविष्य

मेरे पास है कहते हैं: भविष्य 1 साथ सफल होता है

import scala.concurrent._ 
import scala.concurrent.ExecutionContext.Implicits.global 

val f = Future { 
    if(math.random < 0.5) 1 else throw new Exception("Oh no") 
} 

हैं, तो मुझे लगता है कि रखना चाहते हैं, फिर भी अगर यह विफल रहा एक अलग Exception को Exception परिवर्तन करना चाहते हैं।

सबसे अच्छा मैं के साथ बदलना है ऊपर आ सकता है

, हालांकि मुझे सफलता मामले के लिए एक अनावश्यक कार्य करना आवश्यक है कि:

val f2 = f.transform(s => s, cause => new Exception("Something went wrong", cause)) 

तो ऐसा कोई कारण कोई mapFailure(PartialFunction[Throwable,Throwable]) है?

+7

परिवर्तन करने का सही तरीका है। आपको s => s फ़ंक्शन बनाने की आवश्यकता नहीं है, बस 'पहचान' –

+0

चीयर्स में पास करें। मुझे 'पहचान' समारोह के बारे में पता नहीं था। मुझे यकीन है कि वहां अधिक बार होगा जहां यह काम में आएगा। – theon

उत्तर

26

वहाँ भी है:

f recover { case cause => throw new Exception("Something went wrong", cause) } 

स्काला 2.12 के बाद से आप कर सकते हैं:

f transform { 
    case s @ Success(_) => s 
    case Failure(cause) => Failure(new Exception("Something went wrong", cause)) 
} 

या

f transform { _.transform(Success(_), cause => Failure(new Exception("Something went wrong", cause)))} 
+1

हालांकि यह एक बहुत ही स्पष्ट वाक्यविन्यास है, फिर भी हमें 'थ्रोबल' को 'थ्रोबल' करने के लिए नए अपवाद को 'फेंकना' है। क्या इसके लिए एक संयोजक है? – owensmartin

+0

@owensmartin मेरी अद्यतन प्रतिक्रिया देखें। :) –

13

आप के रूप recoverWith की कोशिश कर सकते:

f recoverWith{ 
    case ex:Exception => Future.failed(new Exception("foo", ex)) 
} 
+0

भविष्यवाणियों का मूल्यांकन ExeecutionContext पर नहीं किया जाता है: http://www.scala-lang.org/api/current/#scala.concurrent.Future$ '' विफल '' –

+0

@ViktorKlang देखें, मुझे तब भ्रमित होना चाहिए। मैंने इस धारणा को 'impl.KeptPromise' कक्षा '' पूर्ण 'विधि को देखने में किया था। वहां, दो लाइनें हैं 'val readyEC = execor.prepare; (नया कॉलबैक रुनबल (तैयार ईईसी, func))। executeWithValue (completAs) '। मैंने यह स्वीकार करने के लिए यह माना कि भले ही हम एक स्पष्ट मूल्य दे रहे थे कि यह अभी भी किसी कारण से निष्पादक को मार रहा था। यह हमेशा मेरे लिए अजीब लग रहा था और मुझे लगता है कि यह वास्तव में है क्योंकि मैं इसे गलत तरीके से पढ़ रहा था। सर उठाने के लिए धन्यवाद। – cmbaxter

+0

उत्तर के लिए धन्यवाद। 'पुनर्प्राप्ति '/' पुनर्प्राप्ति के साथ मेरा एकमात्र हिचकिचाहट यह है कि जब मैं इसे देखता हूं तो मुझे तुरंत लगता है कि एक सफल परिणाम के साथ विफलता से पुनर्प्राप्त करना है। शायद वह सिर्फ मुझे है। यहां तक ​​कि वे अच्छे विकल्प हैं, धन्यवाद! – theon

संबंधित मुद्दे