আপনি যদি কখনও রুবির ব্যতিক্রম শ্রেণিবিন্যাস দেখে থাকেন তবে আপনি অদ্ভুত কিছু লক্ষ্য করেছেন। 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 এ মানিয়ে নেওয়া
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 থেকে পাইকারি কপি করা হয়েছে
যিনি প্রথম Ernno মডিউলটি তৈরি করেছেন তিনিই সরাসরি libc থেকে ত্রুটির নামগুলি কপি করেছেন। সুতরাং ENOINT, C-তে, একটি ম্যাক্রোর নাম যাতে পূর্ণসংখ্যার ত্রুটি কোড থাকে যা OS কোনো ফাইল খুঁজে না পেলে ফেরত দেয়।
সুতরাং, এইগুলির প্রত্যেকটি কী করে তা খুঁজে বের করার জন্য কৌশলটি হল সি স্ট্যান্ডার্ড লাইব্রেরির জন্য ডকুমেন্টেশন দেখা। আপনি এখানে তাদের একটি বড় তালিকা খুঁজে পেতে পারেন. আমি নীচে আরও প্রাসঙ্গিক কিছু উদ্ধৃত করেছি:
EPERM | অপারেশন অনুমোদিত নয়; আপনার অনুমতি না থাকলে আপনি ফাইলটি অ্যাক্সেস করতে পারবেন না৷ | ৷
ENOENT | ফাইল বা ডিরেক্টরি পাওয়া যায়নি। |
EIO | ইনপুট/আউটপুট ত্রুটি; সাধারণত শারীরিক পড়া বা লেখার ত্রুটির জন্য ব্যবহৃত হয়। |
EBADF | খারাপ ফাইল বর্ণনাকারী। আপনি যদি শুধুমাত্র পড়ার জন্য খোলা একটি ফাইলে লেখার চেষ্টা করেন তাহলে আপনি এই ত্রুটিটি পাবেন। |
শিশু | আপনি একটি শিশু প্রক্রিয়া পরিচালনা করার চেষ্টা করেছেন, কিন্তু সেখানে কোনো শিশু প্রক্রিয়া নেই। |
ENOMEM | আপনার RAM শেষ হয়ে গেছে, এবং আর কোনো ভার্চুয়াল মেমরি বরাদ্দ করতে পারবেন না। |
EACCES | অনুমতি অস্বীকার করা হয়েছে; ফাইলের অনুমতিগুলি প্রচেষ্টা চালানোর অনুমতি দেয় না৷ | ৷
ENOTBLK | আপনি একটি সাধারণ ফাইলকে একটি ডিভাইস হিসাবে মাউন্ট করার চেষ্টা করেছেন, যেমন একটি HDD৷ | ৷
EBUSY | সম্পদ ব্যস্ত; একটি সিস্টেম রিসোর্স যা ভাগ করা যাবে না ইতিমধ্যেই ব্যবহার করা হচ্ছে৷ উদাহরণস্বরূপ, যদি আপনি একটি ফাইল মুছে ফেলার চেষ্টা করেন যা বর্তমানে মাউন্ট করা ফাইল সিস্টেমের মূল, আপনি এই ত্রুটিটি পাবেন৷ |
বিদ্যমান | ফাইল বিদ্যমান; একটি বিদ্যমান ফাইল এমন একটি প্রেক্ষাপটে নির্দিষ্ট করা হয়েছিল যেখানে এটি শুধুমাত্র একটি নতুন ফাইল নির্দিষ্ট করার অর্থ বহন করে৷ |
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 সীমার বিশদ বিবরণের জন্য সম্পদের সীমা দেখুন৷ | ৷