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

रूबी में अपवादों को बचाना: सुरक्षित त्रुटि प्रबंधन तकनीकें

एक उठा हुआ अपवाद बचाया जा सकता है ताकि यह कॉल स्टैक के शीर्ष पर पहुंचने पर आपके एप्लिकेशन को क्रैश होने से रोक सके। रूबी में, हम इसके लिए 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 पर हमें बताने में संकोच न करें। बेशक, हम जानना चाहेंगे कि आपको यह लेख कैसा लगा, या यदि आप किसी अन्य विषय के बारे में अधिक जानना चाहते हैं।

  1. Ruby में कस्टम अपवाद में महारत हासिल करें: एक चरण-दर-चरण गाइड Ruby में कस्टम अपवाद में महारत हासिल करें: एक चरण-दर-चरण गाइड

    Ruby में अपने स्वयं के अपवाद बनाना आसान है। बस इन चरणों का पालन करें: 1. एक नई क्लास बनाएं अपवाद क्लास हैं, Ruby में बाकी सब की तरह! एक नए प्रकार का अपवाद बनाने के लिए, बस एक क्लास बनाएं जो StandardError, या उसके बच्चों में से एक से इनहेरिट करती है। class MyError < StandardError end raise MyError

  1. रूबी एक्सेप्शन को प्रासंगिक डेटा के साथ बढ़ाएं – एक व्यावहारिक गाइड रूबी एक्सेप्शन को प्रासंगिक डेटा के साथ बढ़ाएं – एक व्यावहारिक गाइड

    कभी-कभी मानक बैकट्रेस/एरर मैसेज कॉम्बो पर्याप्त नहीं होता। कभी-कभी आपको एरर के कारण का पता लगाने के लिए अतिरिक्त डेटा की आवश्यकता होती है। सौभाग्य से, रूबी में यह करना बेहद आसान है। एरर मैसेज कस्टमाइज़ करना अपने एरर में प्रासंगिक जानकारी जोड़ने का सबसे सरल तरीका है उसे एक्सेप्शन के मैसेज में शामिल क

  1. रूबी एक्सेप्शन में TracePoint के साथ महारत हासिल करें: जटिल एरर परिदृश्यों का निदान करें रूबी एक्सेप्शन में TracePoint के साथ महारत हासिल करें: जटिल एरर परिदृश्यों का निदान करें

    कभी-कभी यह समझना वास्तव में मुश्किल हो सकता है कि एक्सेप्शन के साथ क्या हो रहा है - विशेष रूप से बड़े ऐप्स में। कल्पना करें कि आप किसी मौजूदा प्रोजेक्ट के अंदर कुछ कोड पर काम कर रहे हैं। आप एक एक्सेप्शन उठाते हैं, फिर कुछ अजीब होता है। शायद एक्सेप्शन निगल लिया जाता है। शायद एक एनवायरनमेंट वेरिएबल बद