एक उठा हुआ अपवाद बचाया जा सकता है ताकि यह कॉल स्टैक के शीर्ष पर पहुंचने पर आपके एप्लिकेशन को क्रैश होने से रोक सके। रूबी में, हम इसके लिए rescue कीवर्ड का उपयोग करते हैं।
रूबी में किसी अपवाद को बचाते समय, आप एक विशिष्ट त्रुटि वर्ग निर्दिष्ट कर सकते हैं जिसे बचाया जाना चाहिए।
begin raise 'यह अपवाद बचाया जाएगा!' rescue StandardError => e puts "बचाया गया: #{e.inspect}" end
नोट: जब बिना अपवाद वर्ग निर्दिष्ट किए raise का उपयोग किया जाता है, तो रूबी डिफ़ॉल्ट रूप से RuntimeError का उपयोग करेगा।
एकल अपवाद वर्ग को बचाने के अलावा, आप rescue कीवर्ड को अपवाद वर्गों की एक सरणी पास कर सकते हैं। यह आपको एक ही तरीके से कई त्रुटियों का जवाब देने की अनुमति देगा।
begin raise 'यह अपवाद बचाया जाएगा!' rescue StandardError, AnotherError => e puts "बचाया गया: #{e.inspect}" end
एकाधिक rescue ब्लॉक का उपयोग विभिन्न त्रुटियों को अलग-अलग तरीकों से संभालने के लिए किया जा सकता है। यह तब उपयोगी हो सकता है जब किसी लाइब्रेरी के साथ काम कर रहे हों जो विभिन्न परिदृश्यों के लिए अलग-अलग अपवाद उत्पन्न करती है।
begin raise 'यह अपवाद बचाया जाएगा!' rescue StandardError => e puts "बचाया गया: #{e.inspect}" rescue AnotherError => e puts "बचाया गया, लेकिन एक अलग ब्लॉक के साथ: #{e.inspect}" end
अपवाद पदानुक्रम
रूबी का अपवाद पदानुक्रम विभिन्न प्रकार की त्रुटियों के बीच अंतर करने के लिए उपयोग किया जाता है, जबकि आपको उन सभी को निर्दिष्ट किए बिना त्रुटियों के एक समूह से बचाने की क्षमता देता है।
हालांकि लाइब्रेरी अपने स्वयं के अपवाद उपवर्ग परिभाषित कर सकती हैं, रूबी 2.5 पर अंतर्निहित अपवाद उपवर्गों की सूची इस तरह दिखती है:
- NoMemoryError - ScriptError - LoadError - NotImplementedError - SyntaxError - SecurityError - SignalException - Interrupt - StandardError (डिफ़ॉल्ट `rescue` के लिए) - ArgumentError - UncaughtThrowError - EncodingError - FiberError - IOError - EOFError - IndexError - KeyError - StopIteration - LocalJumpError - NameError - NoMethodError - RangeError - FloatDomainError - RegexpError - RuntimeError (डिफ़ॉल्ट `raise` के लिए) - SystemCallError - Errno::* - ThreadError - TypeError - ZeroDivisionError - SystemExit - SystemStackError - fatal (बचाना असंभव)
rescue ब्लॉक में अपवाद वर्ग को छोड़ते समय, StandardError माना जाता है। क्योंकि ArgumentError और NoMethodError StandardError के उपवर्ग हैं, जब वे ब्लॉक में होते हैं तो उन्हें बचाया जाता है।
अपवाद पदानुक्रम कैसे काम करता है इसका एक अच्छा उदाहरण SystemCallError है, जो एक निम्न-स्तरीय प्लेटफ़ॉर्म-निर्भर अपवाद वर्ग है। यह अक्सर फाइलों को पढ़ते या लिखते समय देखा जाता है।
रूबी की File.read मेथड एक अपवाद उठाएगी यदि यह फ़ाइल पढ़ने में विफल होती है। ऐसा कई कारणों से हो सकता है, जैसे फ़ाइल का अस्तित्व न होना या प्रोग्राम के पास इसे पढ़ने के लिए सही अनुमति न होना।
चूंकि ये समस्याएं प्लेटफ़ॉर्म-निर्भर हैं, रूबी मशीन पर चल रहे ऑपरेटिंग सिस्टम के प्रकार के आधार पर अलग-अलग अपवाद उठा सकती है। इस तरह की निम्न-स्तरीय त्रुटियों के लिए, रूबी प्रत्येक प्लेटफ़ॉर्म के लिए Errno::*-अपवादों की एक अलग सूची लागू करती है।
ये सभी Errno::* अपवाद SystemCallError के उपवर्ग हैं। हालांकि वे प्लेटफ़ॉर्म-विशिष्ट हैं, फिर भी उन्हें SystemCallError से बचाकर rescue ब्लॉक में उपयोग किया जा सकता है।
begin File.read("does/not/exist") rescue SystemCallError => e puts "बचाया गया: #{e.inspect}" end
अपवादों को निगलना
आमतौर पर, अपवादों को बचाते समय यथासंभव विशिष्ट होना सबसे अच्छा होता है, ताकि अनजाने में अपवादों को न निगल लिया जाए।
image = nil begin File.read(image.filename) rescue puts "फ़ाइल पढ़ी नहीं जा सकती!" end
इस उदाहरण में, image वेरिएबल nil है, इसलिए जब हम इस पर #filename कॉल करने का प्रयास करते हैं तो यह NoMethodError उठाता है (NoMethodError: undefined method `filename' for nil:NilClass)। क्योंकि हर StandardError उपवर्ग बचाया जाता है (जिसमें NoMethodError शामिल है), अपवाद निगल लिया जाता है और "फ़ाइल पढ़ी नहीं जा सकती!" संदेश प्रिंट होता है। यह कोड में एक संभावित बग को छुपाता है।
नोट: हालांकि यह संभव है, rescue ब्लॉक में Exception सुपरक्लास का उपयोग करना अत्यधिक हतोत्साहित किया जाता है।
रूबी में अपवाद उठाने या बचाने के बारे में कोई प्रश्न? कृपया @AppSignal पर हमें बताने में संकोच न करें। बेशक, हम जानना चाहेंगे कि आपको यह लेख कैसा लगा, या यदि आप किसी अन्य विषय के बारे में अधिक जानना चाहते हैं।