2013-10-30 3 views
5

मेरे पहले स्कैला कार्यक्रम के लिए, मैं एक छोटी उपयोगिता लिखने की कोशिश कर रहा हूं जो एक एक्सएमएल फ़ाइल को एक स्कीमा से दूसरे में परिवर्तित कर देगा।स्केल में कोई भी वापस कैसे करें

मैं एक तरीका है जिसके मुझे फ़ाइल सामग्री दे देंगे लिखना शुरू किया:

def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = { 
    try 
    { 
     val source = scala.io.Source.fromFile(filename, encoding) 
     val contents = source.mkString 
     source.close() 
     return Some(contents) 
    } 
    catch 
    { 
     return None 
    } 

    } 

लेकिन यह संकलन नहीं है। मैं वापस आता हूं "मूल्य लागू कुछ भी नहीं है" और "मान परिभाषित है यह कुछ भी नहीं है" लाइन return None से त्रुटि संदेश के रूप में।

सभी उदाहरण मैं एक विकल्प उपयोग मिलान लौटने में पा सकते हैं, लेकिन यह यहां समझ में नहीं आता है। अगर मैं किसी कारण से फ़ाइल नहीं पढ़ सकता तो मैं बस असफल नहीं होना चाहता हूं।

इस मामले में मुझे क्या करना चाहिए? क्या स्कैला में इस तरह की चीज करने के लिए कोई पैटर्न है?

उत्तर

5

लगभग "catch" है।

स्केला में यह यह संकलन करने के लिए इस तरह होना चाहिए है:

def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = { 
    try { 
     val source = scala.io.Source.fromFile(filename, encoding) 
     val contents = source.mkString 
     source.close() 
     Some(contents) 
    } catch { 
     case x: IOException => None 
     case x => errorHandler(x) // if any other exception 
    } 
    } 

    def errorHandler(e: Any) = None // put some logic here.. 

तो का उपयोग करें:

catch { case: x:ExceptionType ={ .. handling .. }} 

स्काला catch में एक समारोह है कि तर्क के रूप में एक और समारोह को स्वीकार करता है। तो आपके पास जो भी है वह लागू करने के बारे में शिकायत करेगा। case उस फ़ंक्शन (आंशिक फ़ंक्शन) प्रदान करता है जो catch चाहता है। (संक्षेप में)

नोट: सभी अपवाद unchecked में Scala भी IOException हैं।

+0

लेकिन मैं शैली के बारे में निकोलस रीनाउडो से सहमत हूं - कॉलर को यह तय करने दें कि त्रुटि से निपटने का तरीका, जो भी हो।कभी-कभी, कॉलर को त्रुटि भेजने से पहले, आपको कॉलिंग पक्ष (जैसे सफाई कैश या साफ करने के लिए) पर कुछ सामानों को संभालने की आवश्यकता होती है। – ses

0

इस प्रयास करें:

def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = { 
try 
{ 
    val source = scala.io.Source.fromFile(filename, encoding) 
    val contents = source.mkString 
    source.close() 
    return Some(contents) 
} 
catch 
    { 
    case e:Exception=>{ 
     return None 
    } 

    } 

}

8

इस विशेष मामले (अपवाद हैंडलिंग) में, मैं बजाय एक Try उपयोग करने का सुझाव चाहते हैं।

def loadFile(filename: String, encoding: String = "utf-8"):Option[String] = { 
    Try { 
     val source = scala.io.Source.fromFile(filename, encoding) 
     val contents = source.mkString 
     source.close() 
     return Some(contents) 
    }.toOption 
} 

हालांकि, मैं अपवाद को पकड़ने के खिलाफ अनुशंसा करता हूं। आप None लौटकर त्रुटि के कारण को निगल रहे हैं: क्या यह FileNotFoundException है? एक मानक IOException? त्रुटि के साथ एक संदेश था (Unsupported encoding दिमाग में आता है ...)?

अंगूठे का मेरा नियम कॉलर को अपवादों से निपटने देना है। के बाद से Try सभी आवश्यक तरीकों है, यह एक नहीं बल्कि साफ रास्ते में एक के लिए-समझ में इस्तेमाल किया जा सकता

Try {loadFile("test.txt")}.toOption 

अभी तक बेहतर, वह अपने आप में त्रुटि के बारे में परवाह नहीं करता है, चीजों से निपटने के रूप में आसान के रूप में है :

for(s <- Try {loadFile("test.txt")}; 
    i <- Try {s.toInt}) yield i 

इस का परिणाम देगा या तो एक Success[Int] या एक Failure कि एक अपवाद का वर्णन वास्तव में क्या गलत हो गया होता है।

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