কম্পিউটার

Rubys অদ্ভুত Ernno ব্যতিক্রম বোঝার

আপনি যদি কখনও রুবির ব্যতিক্রম শ্রেণিবিন্যাস দেখে থাকেন তবে আপনি অদ্ভুত কিছু লক্ষ্য করেছেন। 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 সীমার বিশদ বিবরণের জন্য সম্পদের সীমা দেখুন৷


  1. রুবিতে কাস্টম ব্যতিক্রম

  2. RBS, Rubys নতুন টাইপ টীকা সিস্টেম বোঝা

  3. রুবিতে সন্নিবেশ বাছাই বোঝা

  4. ওয়ার্ডপ্রেস ফাইল স্ট্রাকচার এবং ডেটাবেস বোঝার জন্য শিক্ষানবিসদের গাইড