Ruby एक्सेप्शन्स को कैसे हैंडल करें
आप इन एक्सेप्शन्स को कैसे हैंडल करते हैं?
आप उस कोड को लपेट सकते हैं जो एक begin / rescue ब्लॉक के साथ एक्सेप्शन उठाता है।
यहाँ यह कैसे काम करता है...
पहला खंड (begin), उस कोड को रखता है जिसे आप चलाने जा रहे हैं और जो एक एक्सेप्शन उठा सकता है।
उदाहरण:
begin
IO.sysopen('/dev/null')
rescue
# ...
end
यहां हम sysopen के साथ एक फाइल खोलने का प्रयास कर रहे हैं। यदि हम फाइल नहीं खोल सकते तो एक एक्सेप्शन उठाया जाता है।
यह rescue कीवर्ड का उपयोग करने का सही समय है!
इस कीवर्ड का उपयोग करके आप कह सकते हैं कि जब एक एक्सेप्शन उठाया जाता है तो आप क्या होना चाहते हैं। इसलिए विफलता मोड आपके नियंत्रण में है।
उदाहरण:
begin
IO.sysopen('/dev/null')
rescue
puts "IO डिवाइस नहीं खोल सकते।"
end
आप इस एरर को लॉग करना चाहते हैं और शायद किसी प्रकार का डिफ़ॉल्ट मान प्रदान करना चाहते हैं।
एरर्स को नज़रअंदाज़ न करें।
एकाधिक एक्सेप्शन्स को रेस्क्यू करना
आपको यह जानना होगा कि rescue एक वैकल्पिक आर्गुमेंट लेता है।
यह आर्गुमेंट क्या है?
यह आर्गुमेंट एक्सेप्शन क्लास है जिसे आप रेस्क्यू करना चाहते हैं।
यह इस बात पर निर्भर करता है कि आप कौन सा कोड चला रहे हैं।
IO के लिए:
- यह एक गुम फाइल के लिए
Errno::ENOENTहो सकता है - या अनुमति एरर के लिए
Errno::EACCES
सबसे अच्छी बात?
आप एक ही begin/rescue ब्लॉक में कई एक्सेप्शन्स को हैंडल कर सकते हैं।
इस तरह:
begin
IO.sysopen('/dev/null')
rescue Errno::ENOENT
puts "फाइल नहीं मिली।"
rescue Errno::EACCES
puts "अपर्याप्त अनुमतियाँ, फाइल खोलने की अनुमति नहीं है।"
end
यदि आप कई एक्सेप्शन्स के लिए एक ही एक्शन चाहते हैं...
आप ऐसा कर सकते हैं:
begin
IO.sysopen('/dev/null')
rescue Errno::ENOENT, Errno::EACCES
puts "फाइल खोलने में एरर था।"
end
सीखते रहें!
ब्लॉक्स और मेथड्स के अंदर एक्सेप्शन्स को रेस्क्यू कैसे करें
आपको हमेशा begin कीवर्ड का उपयोग नहीं करना पड़ता।
ऐसे मामले हैं जहां आप इसे छोड़ सकते हैं।
कहां?
मेथड्स और ब्लॉक्स के अंदर।
उदाहरण:
def get_null_device
IO.sysopen('/dev/null')
rescue Errno::ENOENT
puts "IO डिवाइस नहीं खोल सकते।"
end
मेथड परिभाषा स्वयं begin का काम करती है, इसलिए आप इसे छोड़ सकते हैं।
आप ब्लॉक्स के साथ भी ऐसा कर सकते हैं।
उदाहरण:
["a.txt", "b.txt", "c.txt"].map do |f|
IO.sysopen(f)
rescue Errno::ENOENT
puts "IO डिवाइस नहीं खोल सकते: #{f}।"
end
अब, begin के बिना rescue कीवर्ड का उपयोग करने का एक और तरीका है।
आइए देखते हैं कि यह कैसे काम करता है।
इनलाइन रेस्क्यू को समझना और यह खतरनाक क्यों है
आप rescue का इनलाइन उपयोग कर सकते हैं।
कुछ दुर्लभ परिदृश्यों में, आप एक्सेप्शन हैंडलिंग के इस रूप को उपयोगी पा सकते हैं।
यहाँ एक उदाहरण है:
["a.txt", "b.txt", "c.txt"].select { |f| File.open(f) rescue nil }.map(&:size)
यह आपको केवल मौजूद फाइलों को खोलने और उनको अनदेखा करने की अनुमति देता है जो मौजूद नहीं हैं।
परिणामस्वरूप, आपको मौजूदा फाइलों का आकार मिलता है।
बिना एक्सेप्शन्स उठाए।
यह क्यों करें?
खैर, यह आपको अपने कोड को एक ही लाइन में रखने देता है।
इसके बारे में बस इतना ही।
इस rescue रूप का उपयोग करते समय एक "छिपा हुआ खतरा" है क्योंकि आप StandardError से उतरने वाले सभी एक्सेप्शन्स प्राप्त कर रहे हैं।
जो अधिकांश एक्सेप्शन्स हैं।
यह अच्छा क्यों नहीं है?
क्योंकि विशिष्ट एक्सेप्शन्स को हैंडल करना सबसे अच्छा है, उनके एक व्यापक चयन के बजाय।
यह अपने आप से एरर्स को छिपाने से बचाता है!
छिपे हुए एरर्स सभी प्रकार के अजीब व्यवहार और डीबग करने में कठिन मुद्दों को जन्म दे सकते हैं।
सारांश
आपने Ruby में एरर्स, बुनियादी एक्सेप्शन हैंडलिंग और rescue / begin कीवर्ड्स के बारे में सीखा।
यदि आपने इसे उपयोगी पाया तो कृपया इस आर्टिकल को शेयर करें 🙂
पढ़ने के लिए धन्यवाद!