2012-09-16 20 views
8

मैंने कुछ लोगों से सुना है कि स्कैला में हम नियंत्रण प्रवाह को तोड़ने के लिए (अन्य कार्यात्मक भाषाओं की तरह) होते हैं ... इसके बजाय हम EitherLeft में त्रुटि लौटाते हैं।या तो विफलताओं को संभालना -> स्टैकट्रैक कहां है?

लेकिन हम उस अपवाद से स्ट्रैट्रैस कैसे प्राप्त करते हैं? अब के लिए मैं बाएं में एक साधारण Error केस क्लास को कोड, संदेश और कारण (Error) के साथ वापस लौटाता हूं। लेकिन अगर मुझे कोई त्रुटि है, तो मुझे स्टैकट्रैक नहीं मिल सकता है। यदि मेरा आवेदन जटिल हो गया है तो उस कोड ब्लॉक को ढूंढना मुश्किल हो सकता है जो Error लौटा ... मूल कारण आवश्यक है।


तो हम अभ्यास में क्या करते हैं?

मैं वापस चाहिए, एक कस्टम Error, जावा प्रकार Exception या Throwable मेरी Left में के बजाय? स्टैक्टास और कारण जैसे महत्वपूर्ण सूचनाओं को खोए बिना स्कैला अपवाद हैंडलिंग के लिए सबसे अच्छा अभ्यास क्या है?

+1

आगामी स्कैला 2.10 में एक नोट के रूप में, [कोशिश भी है] (http://blog.richdougherty.com/2012/06/error-handling-with-scalas-try.html) त्रुटि प्रबंधन –

+0

@ ओम-नाम-नाम धन्यवाद यह वास्तव में अच्छा लगता है! –

उत्तर

11

मैं Either[java.lang.Throwable, A] का उपयोग करने का सुझाव दूंगा (जहां Throwable अभी भी आपको स्टैक ट्रेस तक पहुंच प्रदान करता है), और (सामान्य रूप से) आपके कस्टम त्रुटि प्रकार java.lang.Exception का विस्तार करते हैं।

यह Dispatch 0.9 द्वारा इस्तेमाल किया अभ्यास, उदाहरण के लिए, जहां Either[Throwable, A] संगणना कि विफल हो सकता है प्रतिनिधित्व करने के लिए प्रयोग किया जाता है, और कस्टम त्रुटि प्रकार इस तरह दिखेगा:

case class StatusCode(code: Int) 
    extends Exception("Unexpected response status: %d".format(code)) 

Scalaz 7 के Validation.fromTryCatch(a: => T) भी देता है एक Validation[Throwable, T] , जहां Validation लगभग Either के बराबर है।

+0

मैं तर्क दूंगा कि हालांकि किसी भी में अपवादों को समाहित करने के उदाहरण हैं, यह अभ्यास में करने के लिए एक मूर्ख बात है। यदि आपके पास कुछ त्रुटि कोडिंग योजना है, तो या तो समझ में आता है; अन्यथा केवल अपवाद फेंक दें ताकि कॉल श्रृंखला में उन ऊंचे ऊपर या तो इसे संभाल या पास कर सकें। –

+0

@rs_atl: उदाहरण के लिए, एक स्ट्रिंग को एक पूर्णांक में पार्स करने का प्रयास करते समय मैं 'संख्याफॉर्मेट अपवाद' जैसी किसी चीज़ की संभावना से अटक गया हूं। अपवाद फेंकने और एक कस्टम त्रुटि वर्ग या रैपर का उपयोग करने से सरल 'या तो [थ्रोबल, इंट]' दृष्टिकोण की तुलना में मुझे लगता है। –

+0

@TravisBrown धन्यवाद। क्या यह वाम (अपवाद) के बजाय बाएं (थ्रोबल) को वापस करने का एक अच्छा अभ्यास है? चूंकि हमें किसी भी तरह थ्रोबल्स को पकड़ना नहीं है। यह उदाहरण के लिए आउटऑफमेमरी त्रुटि को पकड़ने के लिए डेवलपर का नेतृत्व कर सकता है? –