কম্পিউটার টিউটোরিয়াল

রুবি এক্সসেপশন হ্যান্ডলিং মাস্টার করুন: একটি প্র্যাগম্যাটিক গাইড

অ্যাপসিগন্যালে আমরা রুবি অ্যাপ্লিকেশনের জন্য এরর ট্র্যাকিং প্রদান করি। এর জন্য, আমরা অ্যাপ্লিকেশনগুলো যা থ্রো করে সকল এক্সসেপশন ক্যাপচার করি এবং ডেভেলপারদের সেগুলো ঘটते হলে নোটিফাই করি।

এক্সসেপশন হ্যান্ডলিং সঠিকভাবে করা কঠিন হতে পারে। এই আর্টিকেলে আমরা ব্যাখ্যা করব এটি কীভাবে কাজ করে, খারাপ হ্যান্ডলিং কী সমস্যা সৃষ্টি করতে পারে এবং কীভাবে সঠিকভাবে এক্সসেপশন রেসকিউ করতে হয়।

এক্সসেপশন রেসকিউ করা

রুবিতে এক্সসেপশন রেসকিউ করে আপনি আপনার অ্যাপ্লিকেশনকে ক্র্যাশ হতে বাঁচাতে পারেন যখন কিছু ভুল হয়। একটি begin .. rescue ব্লকে আপনি আপনার অ্যাপ্লিকেশনের জন্য একটি বিকল্প পথ নির্দিষ্ট করতে পারেন যখন একটি এরর ঘটে।


এছাড়া এটি সম্ভব যে কোন এক্সসেপশনগুলো রেসকিউ করা উচিত সেটি নির্দিষ্ট করা। যখন একটি এক্সসেপশন ক্লাস নির্দিষ্ট করা হয়, সেই এক্সসেপশনের সকল সাবক্লাসও ক্যাপচার হয়।


উপরের উদাহরণে আপনি দেখতে পাচ্ছেন Errno::ENOENT এক্সসেপশনটি ক্যাপচার হয়েছে যখন এর পেরেন্ট SystemCallError রেসকিউ করা হয়েছিল।

এক্সসেপশন চেইনে খুব উপরে রেসকিউ করা

এক্সসেপশন চেইনে খুব উপরে রেসকিউ করা না করা গুরুত্বপূর্ণ। যখন আপনি এটি করেন, সকল সাবক্লাসড এক্সসেপশনও ক্যাপচার হয়, ফলে রেসকিউ ব্লকের ক্যাপচার খুব জেনেরিক হয়ে যায়।

এখানে একটি প্রোগ্রাম আছে যা প্রোগ্রামে পাস করা আর্গুমেন্টের উপর ভিত্তি করে একটি কনফিগ ফাইল পড়ে।


এরর মেসেজ বলল কনফিগ ফাইল পড়া সম্ভব হয়নি, কিন্তু আসলে সমস্যাটি ছিল কোডে একটি টাইপো।


begin .. rescue ব্লক দ্বারা ডিফল্টভাবে ক্যাপচার হওয়া এক্সসেপশন ক্লাস হলো StandardError। যদি আমরা কোনো স্পেসিফিক ক্লাস পাস না করি, রুবি StandardError এবং এর সকল সাবক্লাসড এরর রেসকিউ করবে। NoMethodError সেই এক্সসেপশনগুলোর একটি।

এক স্পেসিফিক এক্সসেপশন ক্লাস রেসকিউ করলে অসম্পর্কিত এররها যেন অকস্মাত ফেইলার স্টেটে নিয়ে যেতে পারে সেটি রোধ হয়। এছাড়া এটি এন্ড ইউজারের জন্য আরও স্পেসিফিক এবং সহায়ক কাস্টম এরর মেসেজ দেয়ার সুযোগ দেয়।


Exception রেসকিউ করা

এক্সসেপশন চেইনে খুব উপরে রেসকিউ করা এখনও লোভনীয় হতে পারে। একটি অ্যাপ্লিকেশন যা সকল এক্সসেপশন থ্রো করতে পারে সেগুলো রেসকিউ করলে সেটি ক্র্যাশ হতে পারবে না। (১০০% আপটাইম হেরে আসুন!) তবে এতে অনেক সমস্যা সৃষ্টি হতে পারে।

Exception ক্লাস রুবিতে মূল এক্সসেপশন ক্লাস। সকল অন্যান্য এক্সসেপশন এই ক্লাসের সাবক্লাস; যদি Exception রেসকিউ করা হয়, সকল এরর ক্যাপচার হয়ে যাবে।

দুটি এক্সসেপশন আছে যেগুলো অধিকাংশ অ্যাপ্লিকেশন রেসকিউ করতে চাবে না: SignalException এবং SystemExit।

SignalException তখন ব্যবহৃত হয় যখন একটি বাহ্যিক সোর্স অ্যাপ্লিকেশনকে বন্ধ করতে বলে। এটি হতে পারে অপারেটিং সিস্টেম যখন সেটি শাট ডাউন করতে চায়, অথবা একটি সিস্টেম অ্যাডমিনিস্ট্রেটর যখন অ্যাপ্লিকেশন বন্ধ করতে চায়। উদাহরণ

SystemExit তখন ব্যবহৃত হয় যখন রুবি অ্যাপ্লিকেশন থেকে exit কল করা হয়। যখন এটি রেইজ হয়, ডেভেলপার অ্যাপ্লিকেশন বন্ধ করতে চান। উদাহরণ

যদি আমরা Exception রেসকিউ করি এবং এই এক্সসেপশনগুলো উঠে যখন অ্যাপ্লিকেশন বর্তমানে begin ... rescue ... end ব্লক চলছে, সেটি এক্সিট করতে পারবে না।

সাধারণ পরিস্থিতিতে Exception রেসকিউ করা খারাপ ধারণা। Exception রেসকিউ করলে, আপনি SignalException এবং SystemExit কে কাজ করতে বাধা দিচ্ছেন, কিন্তু একসাথে LoadError, SyntaxError এবং NoMemoryError দিয়ে নofib বাধা দিচ্ছেন। আরও স্পেসিফিক এক্সসেপশন রেসকিউ করা ভাল।

টেস্টে ফেইলার

যদি Exception রেসকিউ করা হয়, rescue Exception => e ব্যবহার করে, আপনার অ্যাপ্লিকেশনের বাইরের জিনিসপত্রও ভাঙতে পারে। টেস্ট স্যুট আসলে কিছু এরর লুকিয়ে রাখতে পারে।

মিনিটেস্ট এবং RSpec-এ দাবি যে ফেইল করবে সেগুলো একটি এক্সসেপশন রেইজ করে ফেইলড অ্যাসারশন সম্পর্কে জানাতে, ফলে টেস্ট ফেইল হয়। সেগুলো যখন এটি করে, তারা নিজেদের কাস্টম এক্সসেপশন রেইজ করে, যা Exception থেকে সাবক্লাসড।

যদি একটি টেস্টে বা অ্যাপ্লিকেশন কোডে Exception রেসকিউ করা হয়, সেটি একটি অ্যাসারশন ফেইলার সাইলেন্স করতে পারে।


এক্সসেপশন এক্সপেক্ট করা

কিছু কোড এক্সসেপশন রেইজ করার জন্যই তৈরি হয়। একটি টেস্ট স্যুটে এক্সসেপশনটি সাইলেন্স করা সম্ভব যাতে টেস্ট ফেইল না হয় যখন সেগুলো রেইজ হয়।


তবে, এটি টেস্ট করে না যে এক্সসেপশন রেইজ হয়েছে কিনা। যখন এক্সসেপশন রেইজ হয় না, আপনার টেস্ট বুঝতে পারবে না যে আচরণটি এখনও সঠিক কিনা।

এটি অ্যাসার্ট করা সম্ভব যে এক্সসেপশনটি রেইজ হয়েছে, এবং যদি না হয়, তবে কোন এক্সসেপশনটি ছিল।


এক্সসেপশন রি-রেইজ করা

এক অ্যাপ্লিকেশনকে শুধু এক্সসেপশন চেইনের তোপের Exception ক্লাস পর্যন্ত এক্সসেপশন ক্যাপচার করা উচিত যখন একটি খুব ভালো কারণ থাকে। উদাহরণস্বরূপ, যখন একটি ব্লক থেকে এক্সিট করার আগে কিছু ক্লিন-আপ জরুরি, যেমন অস্থায়ী ফাইল ডিলিট করা যা অবশ্যই ডিলিট করতে হবে।

যদি আপনি অবশ্যই Exception রেসকিউ করতে হয়, এর এক রিকমেন্ডেশন হলো আপনার হ্যান্ডলিং শেষ হলে সেটি রি-রেইজ করুন। এইভাবে রুবির এক্সসেপশন হ্যান্ডলিং প্রসেসের suerte সিদ্ধান্ত নিতে পারবে।


নিশ্চিত নন কী রেসকিউ করব?

উল্লেখ করা হয়েছে, কী এরর রেসকিউ করবেন সেটি স্পেসিফিকভাবে বলা ভালো।

যখন আপনি অনিশ্চিত যে একটি অপারেশন কী এক্সসেপশন রেইজ করতে পারে, StandardError রেসকিউ করা একটি ভালো শুরু হতে পারে। আপনার কোড বিভিন্ন সিনেরিওতে রান করুন এবং দেখুন সেটি কী এক্সসেপশন রেইজ করে।


প্রতিবার আপনি একটি নতুন এক্সসেপশনের সাক্ষাত করলে, সেই এক্সসেপশন বা তার প্রাসঙ্গিক পেরেন্ট ক্লাসের জন্য স্পেসিফিক রেসকিউ কেস যোগ করুন। খুব বেশি এক্সসেপশন রেসকিউ করার চেয়ে কী রেসকিউ করবেন সেটি স্পেসিফিক হওয়া ভালো।


এটি সমাপ্ত হয় রুবিতে এক্সসেপশন হ্যান্ডলিং-এর আমাদের প্রাইমার。《 @AppSignal-এ আমাদের জানান যদি আপনি আরও জানতে চান, অথবা কোনো স্পেসিফিক প্রশ্ন থাকে। আপনার অ্যাপে এক্সসেপশন কোথায় এবং কতবার রেইজ হচ্ছে সেটি বুঝতে চাইলে অ্যাপসিগন্যাল ট্রাই করুন।

রুবি এক্সসেপশন হ্যান্ডলিং মাস্টার করুন: একটি প্র্যাগম্যাটিক গাইড

টম ডি ব্রেইন


ত্রিভুজ No
  1. জাভাস্ক্রিপ্ট TypeError: 'undefined' is not an object

  2. RecyclerView-এ LinearLayoutManager দিয়ে টপে স্ক্রোল করার পদ্ধতি

  3. CSS3 Box-Sizing দিয়ে বক্স প্রস্থ নির্ধারণ

  4. C প্রোগ্রামে ম্যাট্রিক্সকে ডায়াগোনালি নিচের দিকে প্রিন্ট করা