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

रूबी में अपवाद के साथ नेस्टेड त्रुटियां#कारण

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

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

आइए देखें कि यह व्यवहार में कैसे काम करता है। यहां, हम एक 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. टीसीमॉलोक के साथ रूबी की मेमोरी आवंटन की रूपरेखा

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

  1. रूबी के साथ एक पार्सर कैसे बनाएं

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