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 में बनाने का काम भी आगे बढ़ रहा है। आपकी टीम ऐसे एरर उठाना चाहती है जो स्टैंडर्ड लाइब्रेरी के दिए गए सामान्य एरर से ज़्यादा विशिष्ट हों। आप कुछ शोध कर रहे हैं, लेकिन आपने दो नए एरर बनाने का फैसला किया है, जो एक्सेप्शन बिहेवियर लागू करते हैं।
किसी संख्या को शून्य से भाग देने पर एक अपरिभाषित परिणाम मिलता है। टीम तय करती है कि इसे एरर के रूप में दिखाना ही सबसे अच्छा है।
DivisionByZeroError मॉड्यूल बनाइए, ताकि उसका एरर संदेश यह हो: "division by zero occurred"
raise DivisionByZeroError
# => ** (DivisionByZeroError) division by zero occurred
RPN कैल्कुलेटर संख्याओं को जोड़ने से पहले उनका हिसाब रखने के लिए एक स्टैक का उपयोग करते हैं। टीम इस स्टैक को संख्याओं के एक ऐरे से दिखाती है (पूर्णांक और दशमलव संख्या), जैसे: [3, 4.0]। हर ऑपरेशन को अपनी गणना करने के लिए स्टैक पर एक निश्चित संख्या में संख्याएँ चाहिए। जब स्टैक पर पर्याप्त संख्याएँ नहीं होतीं, तो इसे स्टैक अंडरफ्लो एरर कहते हैं। StackUnderflowError एक्सेप्शन बनाइए, जो एक डिफाल्ट संदेश और वैकल्पिक अतिरिक्त संदर्भ देता है
raise StackUnderflowError
# => ** (StackUnderflowError) stack underflow occurred
raise StackUnderflowError, "when dividing"
# => ** (StackUnderflowError) stack underflow occurred, context: when dividing
divide/1 फंक्शन बनाइए, जो एक स्टैक (दो संख्याओं का ऐरे) लेता है और:
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
ध्यान दें कि ऐरे का क्रम उलटा है!
Exercism पर साइन अप कीजिए और Elixir को 58 कॉन्सेप्ट168 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।