एक अपवाद एक विशेष डेटा संरचना है जिसमें असाधारण . के बारे में जानकारी होती है आपके आवेदन में हो रही स्थिति। अपवाद तब भेजे जाते हैं जब आपका प्रोग्राम चलना जारी नहीं रख सकता क्योंकि यह नहीं जानता कि किसी विशिष्ट स्थिति से कैसे निपटा जाए। रूबी में, हम ऐसे सिग्नल भेजने को कहते हैं उठाना एक अपवाद।
raise 'this is an exception'
puts "This message won't be printed."
कार्रवाई में अपवाद देखने का सबसे तेज़ तरीका है कि आप स्वयं को उठाएं। raise
. का उपयोग करके एक संदेश के साथ विधि, रूबी एक RuntimeError
बनाएगी इसके विवरण के रूप में पारित पाठ के साथ। यह एक स्टैक ट्रेस भी जोड़ देगा जो इंगित करता है कि आपके कोड में अपवाद कहाँ से उठाया गया था।
$ ruby raise.rb
raise.rb:1:in `<main>': this is an exception (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 'this is an exception'
rescue RuntimeError => exception
puts "Exception rescued: #{exception.inspect}"
# => "Exception rescued: #<RuntimeError: this is an exception>"
end
puts "This message *will* be printed."
उदाहरण को प्रारंभ/बचाव ब्लॉक में पहले से लपेटकर, अपवाद नहीं उठाया जाएगा, और यह हमारे ऐप को क्रैश नहीं करेगा। इसके बजाय, बचाव-ब्लॉक निष्पादित हो जाता है, जो इस मामले में अपवाद की व्याख्या करने वाले संदेश को प्रिंट करता है, विफल कर दिया गया था। साथ ही, क्योंकि यह हमारे ऐप को क्रैश होने से रोकता है, अंतिम संदेश होगा मुद्रित हो जाओ।
यह उदाहरण विशेष रूप से RuntimeError
. से बचाता है s, ताकि कोई अन्य त्रुटि पकड़ में न आए। किन त्रुटियों को बचाया गया है, इसके बारे में विशिष्ट होना सुविधाजनक है, क्योंकि यह आपको विभिन्न त्रुटियों के होने पर अलग-अलग काम करने की अनुमति देगा। साथ ही, यह सुनिश्चित करना महत्वपूर्ण है कि बहुत से अपवादों को न बचाया जाए।
अपवाद से निपटने के बारे में अधिक गहन प्राइमर के लिए, और अपवादों को ठीक से कैसे बचाया जाए, इस पर कुछ सुझावों के लिए, रूबी मैजिक पर हमारे अपवाद प्राइमर देखें।
रूबी में अपवादों को बढ़ाने या पकड़ने के बारे में कोई प्रश्न हैं? कृपया हमें @AppSignal पर बताने में संकोच न करें। बेशक, हमें यह जानना अच्छा लगेगा कि आपको यह लेख कैसा लगा, या यदि आपके पास कोई अन्य विषय है जिसके बारे में आप अधिक जानना चाहते हैं।