Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रूबी में नेस्टेड एक्सेप्शन में महारत हासिल करें: सटीक एरर हैंडलिंग के लिए Exception#cause का लाभ उठाएं

रूबी में एक एक्सेप्शन को रेस्क्यू करना और दूसरे प्रकार का एक्सेप्शन फिर से उठाना एक सामान्य पैटर्न है। ActionView इसका एक बहुत स्पष्ट उदाहरण है। जैसा कि मैंने TracePoint के बारे में पहले के ब्लॉग पोस्ट में उल्लेख किया था, ActionView आपके टेम्पलेट में होने वाले किसी भी एक्सेप्शन को निगल लेता है और उन्हें ActionView::TemplateError के रूप में फिर से उठाता है।

कभी-कभी यह पर्याप्त नहीं होता। आपको वास्तव में उस मूल एक्सेप्शन की आवश्यकता होती है क्योंकि इसमें कुछ डेटा होता है जो समस्या को हल करने में आपकी मदद करेगा। सौभाग्य से, रूबी 2.1 से, आप ठीक ऐसा करने के लिए Exception#cause मेथड का उपयोग कर सकते हैं।

आइए देखें कि यह अभ्यास में कैसे काम करता है। यहां, हम एक NoMethodError उठाते हैं, फिर तुरंत इसे निगल लेते हैं और एक RuntimeError उठाते हैं। फिर हम RuntimeError को पकड़ते हैं और मूल NoMethodError को प्राप्त करने के लिए #cause का उपयोग करते हैं।

def fail_and_reraise raise NoMethodError rescue raise RuntimeError end begin fail_and_reraise rescue => e puts "#{ e } caused by #{ e.cause }" end 

नेस्टेड बैकट्रेस और कस्टम एट्रिब्यूट

#cause मेथड वास्तव में मूल एक्सेप्शन ऑब्जेक्ट को लौटाता है। इसका मतलब है कि आप मूल एक्सेप्शन का हिस्सा रहे किसी भी मेटाडेटा तक पहुंच सकते हैं। आप मूल बैकट्रेस भी प्राप्त कर सकते हैं।

class EatingError < StandardError attr_reader :food def initialize(food) @food = food end end def fail_and_reraise raise EatingError.new("soup") rescue raise RuntimeError end begin fail_and_reraise rescue => e puts "#{ e } caused by #{ e.cause } while eating #{ e.cause.food }" puts e.cause.backtrace.first end 

अनंत और उससे आगे!

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

...लेकिन सिर्फ मज़े के लिए मैंने 100-स्तर गहरे नेस्टेड एक्सेप्शन बनाने की कोशिश की। यह कोड का एक मूर्खतापूर्ण छोटा टुकड़ा है, और मुझे आशा है कि आप कभी भी प्रोडक्शन में इसके जैसा कुछ नहीं देखेंगे।

def recursively_raise(c=0) raise "Level #{ c }" rescue => e if c < 100 recursively_raise(c + 1) else recursively_print(e) end end def recursively_print(e) if e puts e recursively_print(e.cause) end end recursively_raise() # ... Prints the following: # Level 100 # Level 99 # Level 98 # etc. 

  1. रूबी में लीनियर रिग्रेशन के साथ रुझानों का पूर्वानुमान: एक व्यावहारिक गाइड रूबी में लीनियर रिग्रेशन के साथ रुझानों का पूर्वानुमान: एक व्यावहारिक गाइड

    हमारे द्वारा किए जाने वाले कई विकल्प संख्यात्मक संबंधों के इर्द-गिर्द घूमते हैं। हम कुछ खाद्य पदार्थ खाते हैं क्योंकि विज्ञान कहता है कि वे हमारे कोलेस्ट्रॉल को कम करते हैं हम अपनी शिक्षा आगे बढ़ाते हैं क्योंकि हमारे वेतन में वृद्धि होने की संभावना है हम उस पड़ोस में एक घर खरीदते हैं जिसका हमें वि

  1. गूगल TCMalloc के साथ रूबी की मेमोरी आवंटन प्रोफाइलिंग गूगल TCMalloc के साथ रूबी की मेमोरी आवंटन प्रोफाइलिंग

    रूबी में मेमोरी आवंटन कैसे काम करता है? रूबी मेमोरी को चंक्स में प्राप्त करता है, जिन्हें पेज कहा जाता है, नए ऑब्जेक्ट्स यहां सहेजे जाते हैं। फिर… जब ये पेज भर जाते हैं, तो अधिक मेमोरी की आवश्यकता होती है। रूबी malloc फंक्शन के साथ ऑपरेटिंग सिस्टम से अधिक मेमोरी का अनुरोध करता है। यह malloc फंक्शन ऑ

  1. रूबी पार्सिंग में मास्टर करें: स्क्रैच से अपना खुद का पार्सर बनाएं रूबी पार्सिंग में मास्टर करें: स्क्रैच से अपना खुद का पार्सर बनाएं

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