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

रूबी में अपवाद बचाव

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


  1. रूबी में कस्टम अपवाद

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

  1. रूबी में अपवादों में संदर्भ डेटा कैसे जोड़ें

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

  1. रूबी में जटिल अपवाद व्यवहार का पता लगाने के लिए ट्रेसपॉइंट का उपयोग करना

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