Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

Ruby एरर हैंडलिंग मास्टर करें: एक्सेप्शन्स को प्रबंधित करने के लिए `begin` और `rescue` का उपयोग

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 कीवर्ड्स के बारे में सीखा।

यदि आपने इसे उपयोगी पाया तो कृपया इस आर्टिकल को शेयर करें 🙂

पढ़ने के लिए धन्यवाद!


  1. Ruby के grep मेथड में महारत: कोड उदाहरणों के साथ एक व्यावहारिक गाइड Ruby के grep मेथड में महारत: कोड उदाहरणों के साथ एक व्यावहारिक गाइड

    आइए grep मेथड के बारे में बात करते हैं। यह मेथड आपके लिए क्या कर सकता है? आप enumerable ऑब्जेक्ट्स को फ़िल्टर करने के लिए Grep का उपयोग कर सकते हैं, जैसे Arrays और Ranges। "लेकिन select पहले से ही ऐसा करता है!" हाँ, लेकिन grep अलग तरीके से काम करता है और अलग परिणाम उत्पन्न करता है। आइए कुछ

  1. Ruby के Map मेथड में महारत: उदाहरणों के साथ एक व्यावहारिक गाइड Ruby के Map मेथड में महारत: उदाहरणों के साथ एक व्यावहारिक गाइड

    Map एक Ruby मेथड है जिसका उपयोग आप Arrays, Hashes और Ranges के साथ कर सकते हैं। map का मुख्य उपयोग डेटा को ट्रांसफॉर्म करना है। उदाहरण के लिए: स्ट्रिंग्स की एक सरणी दिए जाने पर, आप हर स्ट्रिंग पर जा सकते हैं और हर कैरेक्टर को UPPERCASE बना सकते हैं। या यदि आपके पास User ऑब्जेक्ट्स की एक सूची है... आ

  1. रूबी स्ट्रक्ट्स और OpenStruct में महारत: कुशल वैल्यू ऑब्जेक्ट्स रूबी स्ट्रक्ट्स और OpenStruct में महारत: कुशल वैल्यू ऑब्जेक्ट्स

    रूबी में स्ट्रक्ट क्या है? एक स्ट्रक्ट एक बिल्ट-इन रूबी क्लास है, इसका उपयोग वैल्यू ऑब्जेक्ट्स उत्पन्न करने वाली नई क्लासेस बनाने के लिए किया जाता है। एक वैल्यू ऑब्जेक्ट संबंधित विशेषताओं को एक साथ संग्रहीत करने के लिए उपयोग किया जाता है। यहां एक उदाहरण है: दो निर्देशांकों (x और y) के साथ एक Point।