एक अपवाद एक विशेष डेटा संरचना है जो आपके एप्लिकेशन में होने वाली एक असाधारण स्थिति के बारे में जानकारी रखती है। अपवाद सिग्नल हैं जो तब भेजे जाते हैं जब आपका प्रोग्राम चलते नहीं रह सकता क्योंकि यह नहीं जानता कि किसी विशिष्ट स्थिति से कैसे निपटना है। रूबी में, हम ऐसा सिग्नल भेजने को अपवाद उठाना कहते हैं।
raise 'यह एक अपवाद है'
puts "यह संदेश प्रिंट नहीं होगा।"
कार्रवाई में अपवाद देखने का सबसे तेज़ तरीका है खुद एक उठाना। raise मेथड का उपयोग एक संदेश के साथ करके, रूबी पास किए गए टेक्स्ट को विवरण के साथ एक RuntimeError बनाएगा। यह एक स्टैक ट्रेस भी जोड़ेगा जो आपके कोड में उस स्थान की ओर इशारा करता है जहां से अपवाद उठाया गया था।
$ ruby raise.rb
raise.rb:1:in `<main>': यह एक अपवाद है (RuntimeError)
उपरोक्त उदाहरण स्क्रिप्ट चलाते समय, आप देखेंगे कि, जैसा कि वादा किया गया था, अपवाद उठाए जाने के बाद संदेश प्रिंट नहीं होता। ऐसा इसलिए है क्योंकि अनहैंडल्ड अपवाद आपके प्रोग्राम के निष्पादन को क्रैश करके रोक देते हैं। यह सुनिश्चित करने के लिए है कि आपका एप्लिकेशन अपने कार्यों में से एक को पूरा करने में विफल होने के बाद चलते न रहे।
विभिन्न प्रकार के अपवाद
आंतरिक रूप से, रूबी तब अपवाद उठाता है जब चीजें गलत होती हैं। उदाहरण के लिए, शून्य से संख्या को विभाजित करने का प्रयास करने पर आपको एक अपवाद मिलेगा।
irb(main):001:0> 42/0
ZeroDivisionError: divided by 0
from (irb):1:in `/'
from (irb):1
from /Users/jeff/.asdf/installs/ruby/2.3.0/bin/irb:11:in `<main>'
इस मामले में, अपवाद का प्रकार ZeroDivisionError है, बजाय पहले देखे गए RuntimeError के। दर्जनों अपवाद प्रकार हैं जो रूबी के अपवाद पदानुक्रम बनाते हैं, और वे विभिन्न स्थितियों में उठाए जाते हैं।
RuntimeError एक अधिक सामान्य अपवाद वर्ग है, लेकिन अधिक विशिष्ट उदाहरण हैं। जब किसी ऐसे मेथड को कॉल करने का प्रयास किया जाता है जो मौजूद नहीं है तो NoMethodError उठाया जाता है, और ArgumentError नोट करता है कि किसी मौजूदा मेथड को गलत आर्गुमेंट पास किए गए हैं, उदाहरण के लिए।
अपवादों को बचाना
अधिकांश एप्लिकेशन को अपवादों से उबरने की क्षमता की आवश्यकता होती है। एक वेब एप्लिकेशन में, त्रुटि तब हो सकती है जब कोई उपयोगकर्ता किसी फॉर्म में दोषपूर्ण डेटा सबमिट करता है। इसके परिणामस्वरूप पूरे वेब सर्वर को क्रैश करने के बजाय उपयोगकर्ता को एक त्रुटि संदेश प्रदर्शित करना चाहिए।
ऐसे मामले में, एक अपवाद उठाया जा सकता है, लेकिन यह कॉल स्टैक के शीर्ष पर पहुंचने से पहले वेब सर्वर द्वारा बचाया जाएगा, जो अपवाद को एप्लिकेशन को क्रैश करने से रोकता है।
begin raise 'यह एक अपवाद है' rescue RuntimeError => exception puts "अपवाद बचाया गया: #{exception.inspect}" # => "अपवाद बचाया गया: #<RuntimeError: यह एक अपवाद है>" end puts "यह संदेश *प्रिंट होगा*।"
पहले के उदाहरण को begin/rescue ब्लॉक में लपेटकर, अपवाद उठाया नहीं जाएगा, और यह हमारे ऐप को क्रैश नहीं करेगा। इसके बजाय, rescue-ब्लॉक निष्पादित होता है, जो इस मामले में एक संदेश प्रिंट करता है जो बताता है कि अपवाद को विफल कर दिया गया था। साथ ही, क्योंकि यह हमारे ऐप को क्रैश होने से रोकता है, अंतिम संदेश प्रिंट होगा।
यह उदाहरण विशेष रूप से RuntimeError से बचाता है, इसलिए कोई अन्य त्रुटि नहीं पकड़ी जाएगी। इस बारे में विशिष्ट होना कि किन त्रुटियों को बचाया जाता है, सुविधाजनक है, क्योंकि यह आपको अलग-अलग त्रुटियों के होने पर अलग-अलग चीजें करने की अनुमति देगा। साथ ही, यह सुनिश्चित करना महत्वपूर्ण है कि बहुत अधिक अपवाद न बचाए जाएं।
अपवाद प्रबंधन पर अधिक गहन प्राइमर के लिए, और अपवादों को सही ढंग से बचाने के कुछ सुझावों के लिए, रूबी मैजिक पर हमारे अपवाद प्राइमर को देखें।
रूबी में अपवाद उठाने या पकड़ने के बारे में कोई प्रश्न? कृपया @AppSignal पर हमें बताने में संकोच न करें। बेशक, हम जानना चाहेंगे कि आपको यह लेख कैसा लगा, या यदि आप किसी अन्य विषय के बारे में अधिक जानना चाहते हैं।