2011-11-04 6 views
18

यह मूल रूप से जावा कारखाने के तरीकों को लपेटने के लिए है जो इनपुट के आधार पर आइटम नहीं बनाया जा सकता है, जो अपवाद फेंक देते हैं। मैं की तरह कुछ के लिए देख रहा हूँ आधार पुस्तकालय में:स्कैला में, अपवादों को विकल्पों में बदलने के लिए एक पूर्व-मौजूदा लाइब्रेरी फ़ंक्शन है?

def exceptionToOption[A](f: => A):Option[A] ={ 
    try{ 
     Some(f)} 
    catch{ 
     case e:Exception => None} 
    } 

उपयोग:

val id:Option[UUID] = exceptionToOption(UUID.fromString("this will produce None")) 

मैं जानता हूँ कि मैं अपने ही लिख सकते हैं, लेकिन मैं मैं पहिया नहीं फिर से खोज करने कर रहा हूँ जाँच करना चाहते हैं।

+0

मुझे कुछ उपयोग केस याद आना चाहिए, लेकिन आप [या तो] (http://www.scala-lang.org/api/current/scala/Either.html) का उपयोग नहीं कर सकते? – aishwarya

+3

'या तो' मुझे भी एक बेहतर विचार दिखता है। अपवाद –

+1

में उपयोगी जानकारी हो सकती है Scalaz का सत्यापन इस परिदृश्य में या तो एक सुधार है। –

उत्तर

15

उपयोग scala.util.control.Exception:

import scala.util.control.Exception._ 

allCatch opt f 

और आप इसे और अधिक परिष्कृत कर सकते हैं। उदाहरण के लिए, केवल गणित अपवादों को पकड़ने और अपवाद को पुनः प्राप्त करने:

scala> catching(classOf[ArithmeticException]) either (2/0) 
res5: Either[Throwable,Int] = Left(java.lang.ArithmeticException:/by zero) 
11

हां, आप scala.util.control.Exception ऑब्जेक्ट पर एक नज़र डाल सकते हैं। विशेष रूप से, allCatch फ़ंक्शन।

1

Scalaz Validation[+E, +A] जो Either के समान है प्रदान करता है।

val result: Validation[Throwable, Something] = ... 

result match { 
    case Success(x) => ... 
    case Failure(x) => ... 
} 
8

स्केला 2.10 के रूप में, आप एक scala.util.Try में अपने कोड (जैसे कारखाने विधि) चला सकते हैं और उसके बाद toOption साथ परिवर्तित:

import scala.util.Try 
Try("foo".toInt).toOption // None 
Try("7".toInt).toOption // Some(7) 

या अपने मूल उदाहरण के लिए अनुवाद:

val id: Option[UUID] = Try(UUID.fromString("this will produce None")).toOption