अगर आपने कभी रूबी के एक्सेप्शन हायरार्की पर नज़र डाली है, तो आपने कुछ अजीब देखा होगा। सामान्य एक्सेप्शन जैसे RuntimeError और NoMethodError के अलावा, वहां Errno::* का एक अजीब सा रेफरेंस होता है।
Exception StandardError ... SystemCallError Errno::* ...
अगर आपने कभी डिस्क फुल होने पर डिस्क पर लिखने की कोशिश की है, या फेल हो रहे नेटवर्क पर API कॉल करने की कोशिश की है, तो आपने शायद इस प्रकार के एरर को एक्शन में देखा होगा। आप इसे अभी ट्रिगर कर सकते हैं एक ऐसी फाइल खोलने की कोशिश करके जो मौजूद नहीं है।
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 के अनुकूल बनाना
एरनो एक्सेप्शन अनिवार्य रूप से एक एडॉप्टर हैं। वे ऑपरेटिंग सिस्टम एरर को रूबी के एक्सेप्शन सिस्टम से जोड़ते हैं। ऑपरेटिंग सिस्टम एरर को रूबी से अलग तरीके से संभालता है, इसलिए आपके पास किसी न किसी प्रकार का एडॉप्टर होना अनिवार्य है।
रूबी में, एरर को आमतौर पर एक्सेप्शन के रूप में रिपोर्ट किया जाता है। लेकिन ऑपरेटिंग सिस्टम एरर आमतौर पर सिर्फ इंटीजर होते हैं। इसलिए रूबी हर संभावित 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]
लेकिन इनके नाम इतने गूढ़ क्यों हैं? मेरा मतलब है, मैं कैसे अंदाज़ा लगा सकता हूँ कि ENOENT का अर्थ "फाइल नहीं मिली" है?
...इसका वास्तव में एक बहुत ही सरल उत्तर है।
लिबसी से पूरी तरह कॉपी किया गया
जिसने भी सबसे पहले Errno मॉड्यूल बनाया, उसने एरर के नाम सीधे libc से कॉपी कर लिए। इसलिए ENOENT, C में, एक मैक्रो का नाम है जिसमें वह इंटीजर एरर कोड होता है जो OS तब लौटाता है जब वह कोई फाइल नहीं ढूंढ पाता।
तो यह पता लगाने के लिए कि इनमें से प्रत्येक क्या करता है, तरकीब यह है कि C स्टैंडर्ड लाइब्रेरी के दस्तावेज़ देखें। आप उनमें से एक बड़ी सूची यहां पा सकते हैं। मैंने नीचे कुछ अधिक प्रासंगिक लोगों को उद्धृत किया है:
| EPERM | ऑपरेशन अनुमति नहीं; आप फाइल तक नहीं पहुंच सकते जब तक आपके पास अनुमति न हो। |
| ENOENT | फाइल या डायरेक्टरी नहीं मिली। |
| EIO | इनपुट/आउटपुट एरर; आमतौर पर फिजिकल रीड या राइट एरर के लिए उपयोग किया जाता है। |
| EBADF | खराब फाइल डिस्क्रिप्टर। आपको यह एरर मिलेगा अगर आप किसी ऐसी फाइल पर लिखने की कोशिश करते हैं जिसे आपने केवल पढ़ने के लिए खोला था। |
| 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 | आपने पहले से कनेक्टेड सॉकेट को कनेक्ट करने का प्रयास किया। Connecting देखें। |
| ENOTCONN | सॉकेट किसी से कनेक्ट नहीं है। आपको यह एरर तब मिलता है जब आप डेटा ट्रांसमिट करने की कोशिश करते हैं बिना पहले डेटा के लिए डेस्टिनेशन निर्दिष्ट किए। |
| EDESTADDRREQ | सॉकेट के लिए कोई डिफ़ॉल्ट डेस्टिनेशन एड्रेस सेट नहीं था। आपको यह एरर तब मिलता है जब आप कनेक्शनलेस सॉकेट पर डेटा ट्रांसमिट करने की कोशिश करते हैं बिना पहले connect के साथ डेस्टिनेशन निर्दिष्ट किए। |
| ESHUTDOWN | सॉकेट पहले ही बंद कर दिया गया है। |
| ETIMEDOUT | निर्दिष्ट टाइमआउट वाले सॉकेट ऑपरेशन को टाइमआउट अवधि के दौरान कोई प्रतिक्रिया नहीं मिली। |
| ECONNREFUSED | रिमोट होस्ट ने नेटवर्क कनेक्शन की अनुमति देने से इनकार कर दिया (आमतौर पर क्योंकि वह अनुरोधित सेवा नहीं चला रहा है)। |
| EHOSTDOWN | अनुरोधित नेटवर्क कनेक्शन के लिए रिमोट होस्ट डाउन है। |
| EHOSTUNREACH | अनुरोधित नेटवर्क कनेक्शन के लिए रिमोट होस्ट पहुंच योग्य नहीं है। |
| ENOTEMPTY | डायरेक्टरी खाली नहीं है, जहां खाली डायरेक्टरी की उम्मीद थी। आमतौर पर, यह एरर तब होता है जब आप डायरेक्टरी हटाने की कोशिश कर रहे होते हैं। |
| EPROCLIM | इसका मतलब है कि प्रति-उपयोगकर्ता नई प्रोसेस की सीमा fork के प्रयास से पार हो जाएगी। विवरण के लिए Limits on Resources, RLIMIT_NPROC लिमिट देखें। |