ट्रैक
/
Elixir
Elixir
/
अभ्यास
/
स्टैक अंडरफ्लो
स्टैक अंडरफ्लो

स्टैक अंडरफ्लो

सीखने का अभ्यास

परिचय

एक्सेप्शन

Elixir में हर एरर एक्सेप्शन बिहेवियर को कार्यान्वित करती है। एक्सेस बिहेवियर की तरह ही एक्सेप्शन बिहेवियर भी कुछ कॉलबैक फंक्शन बनाता है। बिहेवियर का सॉफ्टवेयर अनुबंध पूरा करने के लिए मॉड्यूल को ये फंक्शन कार्यान्वित करने पड़ते हैं। एक बार एरर बन जाने के बाद उसमें ये विशेषताएँ होती हैं:

  • मॉड्यूल का नाम ही एरर का नाम तय करता है।
  • मॉड्यूल एक एरर स्ट्रक्ट बनाता है।
  • इस स्ट्रक्ट में :message फील्ड होता है।
  • इच्छित एरर उठाने के लिए इस मॉड्यूल का उपयोग raise/1 और raise/2 के साथ किया जा सकता है।

एक्सेप्शन बिहेवियर दो कॉलबैक भी तय करता है: message/1 और exception/1। अगर इन्हें कार्यान्वित न किया जाए, तो पहले से मौजूद कार्यान्वयन इस्तेमाल हो जाते हैं। raise के साथ कॉल किए जाने पर message/1 एरर स्ट्रक्ट को एक पढ़ने योग्य संदेश में बदल देता है। raise/2 के साथ कॉल किए जाने पर exception/1 संदेश में अतिरिक्त संदर्भ जोड़ने देता है।

एक्सेप्शन बनाना

किसी एरर मॉड्यूल से एक्सेप्शन बनाने के लिए हम defexception मैक्रो का उपयोग करते हैं:

# Defines a minimal error, with the name `MyError`
defmodule MyError do
  defexception message: "error"
end

# Defines an error with a customized exception/1 function
defmodule MyCustomizedError do
  defexception message: "custom error"

  @impl true
  def exception(value) do
    case value do
      [] ->
        %MyCustomizedError{}

      _ ->
        %MyCustomizedError{message: "Alert: " <> value}
    end
  end
end

एक्सेप्शन का उपयोग करना

बनाए गए एरर का उपयोग किसी अंतर्निहित एरर की तरह raise/1 या raise/2 से किया जा सकता है।

  • raise/1 किसी विशेष एरर को उसके मॉड्यूल नाम से उठाता है। अगर आर्गुमेंट एक स्ट्रिंग है, तो यह उस स्ट्रिंग को संदेश बनाकर एक RuntimeError उठाता है।
  • raise/2 किसी विशेष एरर को उसके मॉड्यूल नाम से उठाता है और एक एट्रिब्यूट्स आर्गुमेंट लेता है, जिससे उचित संदेश वाली एरर प्राप्त की जाती है।

निर्देश

आप Instruments of Texas में अपना काम जारी रख रहे हैं। इस बीच RPN कैल्कुलेटर को Elixir में बनाने का काम भी आगे बढ़ रहा है। आपकी टीम ऐसे एरर उठाना चाहती है जो स्टैंडर्ड लाइब्रेरी के दिए गए सामान्य एरर से ज़्यादा विशिष्ट हों। आप कुछ शोध कर रहे हैं, लेकिन आपने दो नए एरर बनाने का फैसला किया है, जो एक्सेप्शन बिहेवियर लागू करते हैं।

1. शून्य से भाग देने पर एरर

किसी संख्या को शून्य से भाग देने पर एक अपरिभाषित परिणाम मिलता है। टीम तय करती है कि इसे एरर के रूप में दिखाना ही सबसे अच्छा है।

DivisionByZeroError मॉड्यूल बनाइए, ताकि उसका एरर संदेश यह हो: "division by zero occurred"

raise DivisionByZeroError
# => ** (DivisionByZeroError) division by zero occurred

2. स्टैक अंडरफ्लो मिलने पर एरर

RPN कैल्कुलेटर संख्याओं को जोड़ने से पहले उनका हिसाब रखने के लिए एक स्टैक का उपयोग करते हैं। टीम इस स्टैक को संख्याओं के एक ऐरे से दिखाती है (पूर्णांक और दशमलव संख्या), जैसे: [3, 4.0]। हर ऑपरेशन को अपनी गणना करने के लिए स्टैक पर एक निश्चित संख्या में संख्याएँ चाहिए। जब स्टैक पर पर्याप्त संख्याएँ नहीं होतीं, तो इसे स्टैक अंडरफ्लो एरर कहते हैं। StackUnderflowError एक्सेप्शन बनाइए, जो एक डिफाल्ट संदेश और वैकल्पिक अतिरिक्त संदर्भ देता है

raise StackUnderflowError
# => ** (StackUnderflowError) stack underflow occurred

raise StackUnderflowError, "when dividing"
# => ** (StackUnderflowError) stack underflow occurred, context: when dividing

3. भाग देने वाला फंक्शन लिखिए

divide/1 फंक्शन बनाइए, जो एक स्टैक (दो संख्याओं का ऐरे) लेता है और:

  • जब स्टैक में पर्याप्त संख्याएँ न हों, तो स्टैक अंडरफ्लो एरर उठाता है
  • जब भाजक 0 हो, तो शून्य से भाग एरर उठाता है (ध्यान दें कि संख्याओं का स्टैक उलटे क्रम में संग्रहीत होता है)
  • जब कोई एरर न उठे, तो भाग देता है
RPNCalculator.Exception.divide([])
# => ** (StackUnderflowError) stack underflow occurred, context: when dividing

RPNCalculator.Exception.divide([0, 100])
# => ** (DivisionByZeroError) division by zero occurred

RPNCalculator.Exception.divide([4, 16])
# => 4

ध्यान दें कि ऐरे का क्रम उलटा है!

GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Elixir Exercism

स्टैक अंडरफ्लो शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Elixir को 58 कॉन्सेप्ट168 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।