2011-10-17 12 views
19

मैंने स्कैला के साथ पढ़ा और प्रयोग किया है 2.9 कोशिश करें ... पकड़ सुविधा, और यह मुझे संभावनाओं के बारे में सोच रहा है। कोड की कुछ पंक्तियों को सहेजने के अलावा मैं वास्तव में इसका उपयोग कैसे करूं?स्कैला 2.9 की कोशिश के लिए उपयोग के मामले क्या हैं ... सामान्यीकरण पकड़ो?

Scala 2.9 Final Release Notes

+0

मुझे यकीन नहीं है कि मैं इसका उपयोग करूंगा .... लेकिन आप * किसी भी * (अनुरूप) आंशिक समारोह का उपयोग कर सकते हैं ... क्या कहीं और एकीकृत त्रुटि है? ('IgnoreTheseSillyClosableExceptions' कहें।) इसके अलावा," यह बहुत अच्छा है "कि स्कैला इसे इस तरह व्यक्त कर सकता है ;-) –

+0

प्रेरणा के लिए: पॉल फिलिप्स ने इसे लागू करने के दौरान एक प्रेरक उदाहरण प्रदान किया: http://www.scala-lang.org/नोड/8070 –

+3

प्रश्न एक उदाहरण या कम से कम एक लिंक के साथ बेहतर होगा। – ziggystar

उत्तर

24

उपयोग के मामले आपके आवेदन भर से निपटने के सामान्य त्रुटि है करने में सक्षम होना है। आइए मान लें कि आप किसी व्यवस्थापक को ई-मेल भेजकर अपने आवेदन में सभी FileNotFoundException एस को संभालना चाहते हैं। इससे पहले, आप इस तरह यह करने के लिए होगा:

// Globally 
val fileNotFound: PartialFunction[Throwable, Unit] = { 
    case e: FileNotFoundException => 
    // Create report and send the e-mail 
} 

// On each try-catch-block 
try { 
    // Open file 
} 
catch { 
    case fnf: FileNotFoundException => fileNotFound(fnf) 
} 

अब तुम सिर्फ कार्य करें:

try { 
    // Open file 
} catch fileNotFound 

यह भी अच्छा लाभ यह है कि आप पर orElse पद्धति का उपयोग करके कई तरह के अपवाद संचालकों लिंक कर सकते हैं है आंशिक कार्य:

val fileErrors = fileNotFound orElse endOfFile orElse invalidFormat 

और फिर बस उस जगह का उपयोग करें जहां आपको फ़ाइल अपवाद हैंडलिंग की आवश्यकता है। उदाहरण के लिए, इस तरह के एक त्रुटि हैंडलर को गतिशील रूप से अनुप्रयोग के लिए कॉन्फ़िगरेशन फ़ाइल के आधार पर जोड़ा जा सकता है। यह हर जगह मिलान पैटर्न और सही हैंडलर को कॉल करने से बहुत कम बोझिल है।

आंशिक कार्यों के शीर्ष पर एक उपयोगी चीज जिसे पंप किया जा सकता है andAlso ऑपरेटर है, जो दो आंशिक कार्यों पर अनुक्रमक ऑपरेटर के रूप में कार्य करता है। यह तब उपयोगी होगा जब आप सामान्य त्रुटि प्रबंधन करने के बाद किसी विशेष प्रयास-पकड़ ब्लॉक के लिए कुछ त्रुटि प्रबंधन करना चाहते हैं।

implicit def pf2ops(pf: PartialFunction[Throwable, Unit]) = new { 
    def andAlso(localpf: PartialFunction[Throwable, Unit]) = new PartialFunction[Throwable, Unit] { 
    def apply(t: Throwable) = { 
     if (pf.isDefinedAt(t)) pf(t) 
     localpf(t) 
    } 
    def isDefinedAt(t: Throwable) = pf.isDefinedAt(t) || localpf.isDefinedAt(t) 
    } 
} 

और फिर आप यह कर सकते हैं:

scala> try { 
    | throw new java.io.FileNotFoundException 
    | } catch fnf andAlso { 
    | case e: Exception => println("I don't know, but something is specific to this particular block.") 
    | } 
I don't know, but something is specific to this particular block. 

मैं तुम्हें andAlso का सही अर्थ विज्ञान और अर्थ (और नाम) के साथ आगे निभा सकता है लगता है।

+0

के लिए एक लिंक जोड़ा अच्छा जवाब - मुझे लगता है कि और भी कुछ हिस्सा मैं लापता था। – Seth

7

axel22 द्वारा अच्छा जवाब, लेकिन मुझे लगता है कि इसके परिचय के लिए वास्तविक कारण कुछ और है। try/catch/finally हैंडलिंग ने विशेष केस पेश किया। आपने आंशिक फ़ंक्शन शाब्दिक उपयोग किया था, लेकिन आप वास्तव में इसे आंशिक फ़ंक्शन के साथ प्रतिस्थापित नहीं कर सके। अब, catch बस आंशिक कार्य प्राप्त करें, और भाषा में एक और विशेष मामला चला गया है।

+0

मुझे यह जवाब भी पसंद है :) – Seth

+0

यह वास्तव में मेरी प्रारंभिक तर्क की पुष्टि करता है - यह मुख्य रूप से एक "साफ-सफाई" सुविधा है। – Seth

+0

सहमत - यह एक समानता सिद्धांत है जो इसके सर्वोत्तम रूप में है - एक सामान्यीकृत निर्माण जिसके परिणामस्वरूप प्रयोज्यता है। – axel22

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