यदि आपने कभी रूबी के अपवाद पदानुक्रम पर एक नज़र डाली है, तो आपने कुछ अजीब देखा होगा। 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 सीमा के विवरण के लिए संसाधनों की सीमा देखें। |