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

रूबी के अजीब इरनो अपवादों को समझना

यदि आपने कभी रूबी के अपवाद पदानुक्रम पर एक नज़र डाली है, तो आपने कुछ अजीब देखा होगा। RuntimeError और NoMethodError जैसे सभी सामान्य अपवादों के अलावा, Errno::* का एक अजीब संदर्भ भी है। ।

Exception
  StandardError
    ...
    SystemCallError
      Errno::*
    ...

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

irb> File.open("badfilename.txt")
Errno::ENOENT: No such file or directory @ rb_sysopen - badfilename.txt
    from (irb):9:in `initialize'
    from (irb):9:in `open'
    from (irb):9
    from /Users/snhorne/.rbenv/versions/2.1.0/bin/irb:11:in `<main>'

लेकिन वास्तव में एरोनो अपवाद क्या हैं? और अन्य प्रकार के अपवादों के लिए उनके साथ अलग व्यवहार क्यों किया जाता है?

रूबी को OS में बदलना

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

रूबी में, त्रुटियों को अपवाद के रूप में रिपोर्ट किया जाता है। लेकिन ऑपरेटिंग सिस्टम त्रुटियां आमतौर पर केवल पूर्णांक होती हैं। तो रूबी प्रत्येक संभावित ओएस त्रुटि के लिए एक अपवाद वर्ग को परिभाषित करता है। फिर यह इन सभी अपवादों को एक मॉड्यूल . में चिपका देता है एर्नो कहा जाता है।

हम इस मॉड्यूल में सभी अपवादों को देखने के लिए IRB का उपयोग कर सकते हैं। और लड़के, क्या बहुत कुछ है!

irb> Errno.constants
=> [:NOERROR, :EPERM, :ENOENT, :ESRCH, :EINTR, :EIO, :ENXIO, :E2BIG, :ENOEXEC, :EBADF, :ECHILD, :EAGAIN, :ENOMEM, :EACCES, :EFAULT, :ENOTBLK, :EBUSY, :EEXIST, :EXDEV, :ENODEV, :ENOTDIR, :EISDIR, :EINVAL, :ENFILE, :EMFILE, :ENOTTY, :ETXTBSY, :EFBIG, :ENOSPC, :ESPIPE, :EROFS, :EMLINK, :EPIPE, :EDOM, :ERANGE, :EDEADLK, :ENAMETOOLONG, :ENOLCK, :ENOSYS, :ENOTEMPTY, :ELOOP, :EWOULDBLOCK, :ENOMSG, :EIDRM, :ECHRNG, :EL2NSYNC, :EL3HLT, :EL3RST, :ELNRNG, :EUNATCH, :ENOCSI, :EL2HLT, :EBADE, :EBADR, :EXFULL, :ENOANO, :EBADRQC, :EBADSLT, :EDEADLOCK, :EBFONT, :ENOSTR, :ENODATA, :ETIME, :ENOSR, :ENONET, :ENOPKG, :EREMOTE, :ENOLINK, :EADV, :ESRMNT, :ECOMM, :EPROTO, :EMULTIHOP, :EDOTDOT, :EBADMSG, :EOVERFLOW, :ENOTUNIQ, :EBADFD, :EREMCHG, :ELIBACC, :ELIBBAD, :ELIBSCN, :ELIBMAX, :ELIBEXEC, :EILSEQ, :ERESTART, :ESTRPIPE, :EUSERS, :ENOTSOCK, :EDESTADDRREQ, :EMSGSIZE, :EPROTOTYPE, :ENOPROTOOPT, :EPROTONOSUPPORT, :ESOCKTNOSUPPORT, :EOPNOTSUPP, :EPFNOSUPPORT, :EAFNOSUPPORT, :EADDRINUSE, :EADDRNOTAVAIL, :ENETDOWN, :ENETUNREACH, :ENETRESET, :ECONNABORTED, :ECONNRESET, :ENOBUFS, :EISCONN, :ENOTCONN, :ESHUTDOWN, :ETOOMANYREFS, :ETIMEDOUT, :ECONNREFUSED, :EHOSTDOWN, :EHOSTUNREACH, :EALREADY, :EINPROGRESS, :ESTALE, :EUCLEAN, :ENOTNAM, :ENAVAIL, :EISNAM, :EREMOTEIO, :EDQUOT, :ECANCELED, :EKEYEXPIRED, :EKEYREJECTED, :EKEYREVOKED, :EMEDIUMTYPE, :ENOKEY, :ENOMEDIUM, :ENOTRECOVERABLE, :EOWNERDEAD, :ERFKILL, :EAUTH, :EBADRPC, :EDOOFUS, :EFTYPE, :ENEEDAUTH, :ENOATTR, :ENOTSUP, :EPROCLIM, :EPROCUNAVAIL, :EPROGMISMATCH, :EPROGUNAVAIL, :ERPCMISMATCH, :EIPSEC]

लेकिन उनका नाम इतना गुप्त रूप से क्यों रखा गया है? मेरा मतलब है, मैं कभी कैसे अनुमान लगा सकता हूँ कि ENOINT का अर्थ है "फ़ाइल नहीं मिली?"

...वास्तव में एक बहुत ही सरल उत्तर है।

libc से थोक कॉपी किया गया

जिसने भी सबसे पहले Errno मॉड्यूल बनाया है  बस त्रुटि नामों को सीधे libc से कॉपी किया है। तो ENOINT, C में, एक मैक्रो का नाम है जिसमें पूर्णांक त्रुटि कोड होता है जो OS तब लौटाता है जब उसे कोई फ़ाइल नहीं मिलती है।

तो, वास्तव में यह पता लगाने के लिए कि इनमें से प्रत्येक क्या चाल करता है सी मानक पुस्तकालय के लिए प्रलेखन को देखना है। आप यहां उनकी एक बड़ी सूची पा सकते हैं। मैंने नीचे कुछ अधिक प्रासंगिक अंश दिए हैं:

EPERM ऑपरेशन की अनुमति नहीं है; जब तक आपके पास अनुमति न हो, आप फ़ाइल तक नहीं पहुंच सकते।
ENOENT फ़ाइल या निर्देशिका नहीं मिली।
EIO इनपुट/आउटपुट त्रुटि; आमतौर पर शारीरिक पढ़ने या लिखने की त्रुटियों के लिए उपयोग किया जाता है।
ईबीएडीएफ खराब फाइल डिस्क्रिप्टर। उदाहरण के लिए, यदि आप केवल पढ़ने के लिए खोली गई फ़ाइल को लिखने का प्रयास करते हैं, तो आपको यह त्रुटि प्राप्त होगी।
ECHILD आपने चाइल्ड प्रोसेस में हेर-फेर करने की कोशिश की, लेकिन कोई चाइल्ड प्रोसेस नहीं है।
ENOMEM आपकी RAM खत्म हो गई है, और आप और वर्चुअल मेमोरी आवंटित नहीं कर सकते।
EACCES अनुमति अस्वीकृत; फ़ाइल अनुमतियाँ प्रयास किए गए संचालन की अनुमति नहीं देती हैं।
ENOTBLK आपने HDD की तरह एक सामान्य फ़ाइल को डिवाइस के रूप में माउंट करने का प्रयास किया।
EBUSY संसाधन व्यस्त; एक सिस्टम संसाधन जिसे साझा नहीं किया जा सकता, पहले से उपयोग में है। उदाहरण के लिए, यदि आप किसी ऐसी फ़ाइल को हटाने का प्रयास करते हैं जो वर्तमान में माउंटेड फाइल सिस्टम की जड़ है, तो आपको यह त्रुटि मिलती है।
EEXIST फ़ाइल मौजूद है; एक मौजूदा फ़ाइल को उस संदर्भ में निर्दिष्ट किया गया था जहां केवल एक नई फ़ाइल निर्दिष्ट करना समझ में आता है।
ENOTDIR एक फ़ाइल जो निर्देशिका नहीं है, एक निर्देशिका की आवश्यकता होने पर निर्दिष्ट की गई थी।
EISDIR फ़ाइल एक निर्देशिका है; आप लिखने के लिए निर्देशिका नहीं खोल सकते हैं, या इसके हार्ड लिंक बना या हटा नहीं सकते हैं।
EINVAL अवैध तर्क। इसका उपयोग विभिन्न प्रकार की समस्याओं को इंगित करने के लिए किया जाता है, जिसमें लाइब्रेरी फ़ंक्शन में गलत तर्क पारित किया जाता है।
EMFILE वर्तमान प्रक्रिया में बहुत अधिक फ़ाइलें खुली हैं और अब और नहीं खुल सकतीं। डुप्लीकेट डिस्क्रिप्टर इस सीमा में गिने जाते हैं।
EFBIG फ़ाइल बहुत बड़ी है; फ़ाइल का आकार सिस्टम द्वारा अनुमत से बड़ा होगा।
ENOSPC डिवाइस पर कोई स्थान नहीं बचा; फ़ाइल पर लिखने का कार्य विफल हुआ क्योंकि डिस्क भर गई है।
ESPIPE अमान्य खोज ऑपरेशन (जैसे पाइप पर)।
EROFS केवल-पढ़ने के लिए फ़ाइल सिस्टम पर कुछ संशोधित करने का प्रयास किया गया था।
EPIPE टूटा हुआ पाइप; पाइप के दूसरे छोर से पढ़ने की कोई प्रक्रिया नहीं है
ENOTSOCK एक सॉकेट की आवश्यकता होने पर एक फ़ाइल जो सॉकेट नहीं है निर्दिष्ट की गई थी।
ENETUNREACH सॉकेट कार्रवाई विफल रही क्योंकि रिमोट होस्ट वाले सबनेट पहुंच योग्य नहीं था।
ENETRESET नेटवर्क कनेक्शन रीसेट किया गया था क्योंकि रिमोट होस्ट क्रैश हो गया था।
ECONNABORTED एक नेटवर्क कनेक्शन स्थानीय रूप से निरस्त कर दिया गया था।
ECONNRESET स्थानीय होस्ट के नियंत्रण से बाहर के कारणों से नेटवर्क कनेक्शन बंद कर दिया गया था, जैसे रिमोट मशीन रीबूटिंग या एक अप्राप्य प्रोटोकॉल उल्लंघन।
ENOBUFS I/O संचालन के लिए कर्नेल के बफ़र्स सभी उपयोग में हैं। GNU में, यह त्रुटि हमेशा ENOMEM का पर्याय है; आप नेटवर्क संचालन से एक या दूसरे को प्राप्त कर सकते हैं।
EISCONN आपने पहले से कनेक्टेड सॉकेट को कनेक्ट करने का प्रयास किया। कनेक्ट करना देखें।
ENOTCONN सॉकेट किसी भी चीज़ से कनेक्ट नहीं है। आपको यह त्रुटि तब मिलती है जब आप किसी सॉकेट पर डेटा संचारित करने का प्रयास करते हैं, पहले डेटा के लिए कोई गंतव्य निर्दिष्ट किए बिना।
EDESTADDRREQ सॉकेट के लिए कोई डिफ़ॉल्ट गंतव्य पता सेट नहीं किया गया था। आपको यह त्रुटि तब मिलती है जब आप कनेक्शन रहित सॉकेट पर डेटा संचारित करने का प्रयास करते हैं, पहले कनेक्ट वाले डेटा के लिए कोई गंतव्य निर्दिष्ट किए बिना।
ESHUTDOWN सॉकेट पहले ही बंद हो चुका है।
ETIMEDOUT एक निर्दिष्ट टाइमआउट वाले सॉकेट ऑपरेशन को टाइमआउट अवधि के दौरान कोई प्रतिक्रिया नहीं मिली।
ECONNREFUSED एक दूरस्थ होस्ट ने नेटवर्क कनेक्शन की अनुमति देने से इनकार कर दिया (आमतौर पर क्योंकि यह अनुरोधित सेवा नहीं चला रहा है)।
EHOSTDOWN अनुरोधित नेटवर्क कनेक्शन के लिए दूरस्थ होस्ट बंद है।
EHOSTUNREACH अनुरोधित नेटवर्क कनेक्शन के लिए दूरस्थ होस्ट उपलब्ध नहीं है।
ENOTEMPTY निर्देशिका खाली नहीं है, जहां एक खाली निर्देशिका अपेक्षित थी। आमतौर पर, यह त्रुटि तब होती है जब आप किसी निर्देशिका को हटाने का प्रयास कर रहे होते हैं।
EPROCLIM इसका मतलब है कि नई प्रक्रिया पर प्रति-उपयोगकर्ता सीमा एक प्रयास किए गए कांटे से अधिक हो जाएगी। RLIMIT_NPROC सीमा के विवरण के लिए संसाधनों की सीमा देखें।


  1. आरबीएस को समझना, रूबीज न्यू टाइप एनोटेशन सिस्टम

    रूबी के लिए आरबीएस एक नए प्रकार की सिंटैक्स प्रारूप भाषा का नाम है। RBS आपको .rbs नामक एक नए एक्सटेंशन के साथ फाइलों में अपने रूबी कोड में टाइप एनोटेशन जोड़ने देता है . वे इस तरह दिखते हैं: class MyClass def my_method : (my_param: String) -> String end RBS के साथ टाइप एनोटेशन प्रदान करने से आ

  1. रूबी में इंसर्शन सॉर्ट को समझना

    नोट:रूबी के साथ विभिन्न सॉर्टिंग एल्गोरिदम को लागू करने पर विचार करने वाली श्रृंखला में यह भाग 4 है। भाग 1 ने बबल सॉर्ट की खोज की, भाग 2 ने चयन प्रकार की खोज की, और भाग 3 ने मर्ज सॉर्ट की खोज की। जैसा कि हम डेटा सॉर्ट करने के लिए विभिन्न तरीकों का पता लगाना जारी रखते हैं, हम इंसर्शन सॉर्ट की ओर रु

  1. WordPress फ़ाइल संरचना और डेटाबेस को समझने के लिए शुरुआती मार्गदर्शिका

    सामान्य परिस्थितियों में, वर्डप्रेस फ़ाइल संरचना . के बारे में चिंतित होने की कोई वास्तविक आवश्यकता नहीं है . वर्डप्रेस में एक बेहतरीन wp-admin इंटरफ़ेस है जो आपको यह जाने बिना कि इंजन हुड के तहत कैसे काम करता है, अपनी साइट को चलाने पर ध्यान केंद्रित करने में सक्षम बनाता है। हालांकि, आपकी साइट के