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