রুবিতে একটি সাধারণ সমস্যা হলো আপনি এরর মেসেজ পান, যাকে টেকনিক্যাল টার্মে আমরা "এক্সেপশন" বলি।
এই এক্সেপশনগুলো এক্সপেক্টেড হতে পারে, যেমন একটি ফাইল যা কখনও কখনও উপলব্ধ থাকে কিন্তু অন্য সময় মিসিং থাকে, বা একটি API যা কিছু রেস্ট্রিকশনের কারণে مؤقتে উপলব্ধ থাকে, অথবা এগুলো আনেক্সপেক্টেড হতে পারে।
আজ আপনি এক্সপেক্টেড এরর ম্যানেজ করতে শিখবেন।
কীভাবে?
ভালো, আমি আপনাকে রুবিতে "begin" এবং "rescue" থেকে পরিচয় করাই, দুটি গুরুত্বপূর্ণ কীওয়ার্ড যা এরর কন্ডিশন হ্যান্ডল করতে ব্যবহৃত হয়।
এগুলো কীভাবে কাজ করে?
প্রথমে, আপনাকে কিছু বুঝতে হবে।
আপনার রুবি প্রোগ্রামগুলো রান হওয়ার সময় একাধিক পয়েন্টে এরর ট্রিগার করতে পারে।
উদাহরণস্বরূপ:
- অস্তিত্বহীন একটি ফাইল পড়ার চেষ্টা করা।
- একটি নম্বরকে শূন্য দিয়ে ভাগ করা।
- আপনি যে ওয়েব সার্ভারের সাথে কাজ করছেন তার পুরনো SSL সার্টিফিকেট রয়েছে।
যখন একটি এরর ঘটে… রুবি সরাসরি ক্র্যাশ করে না!
আপনি এরর থেকে রিকভার করার সুযোগ পান। আমরা এটাকে "এক্সেপশন হ্যান্ডলিং" বলি।
রুবি আপনাকে আপনার কোডে এরর রিকভারি ইমপ্লিমেন্ট করার জন্য কিছু কীওয়ার্ড দেয়। এই কীওয়ার্ডগুলো হলো begin এবং rescue।
চলুন খুঁজে বের করি কীভাবে ব্যবহার করবেন!
রুবি এক্সেপশন কীভাবে হ্যান্ডল করবেন
আপনি এই এক্সেপশনগুলো কীভাবে হ্যান্ডল করবেন?
আপনি যে কোডটি এক্সেপশন রেইজ করতে পারে সেটিকে একটি begin / rescue ব্লক দিয়ে ওয়্র্যাপ করতে পারেন।
এটি কীভাবে কাজ করে…
প্রথম সেকশন (begin), সেটিতে থাকে যে কোডটি আপনি রান করতে যাচ্ছেন এবং যা এক্সেপশন রেইজ করতে পারে।
উদাহরণ:
begin
IO.sysopen('/dev/null')
rescue
# ...
end
এখানে আমরা sysopen দিয়ে একটি ফাইল খোলার চেষ্টা করছি। ফাইল খোলা না হলে একটি এক্সেপশন রেইজ হবে।
এই হলো rescue কীওয়ার্ড ব্যবহার করার পারফেক্ট সময়!
এই কীওয়ার্ড ব্যবহার করে আপনি বলতে পারেন এক্সেপশন রেইজ হলে কী ঘটবে। তাই ফেইলিউর মোড আপনার কন্ট্রোলে থাকে।
উদাহরণ:
begin
IO.sysopen('/dev/null')
rescue
puts "Can't open IO device."
end
আপনি এই এররটি লগ করতে চাবেন এবং হয়তো কোনো ডিফল্ট ভ্যালু দিতে চাবেন।
এররগুলোইগনোর করবেন না।
একাধিক এক্সেপশন রেসকিউ করা (Rescuing Multiple Exceptions)
আপনাকে জানতে হবে যে rescue একটি অপশনাল আর্গুমেন্ট নেয়।
এই আর্গুমেন্ট কী?
এই আর্গুমেন্ট হলো এক্সেপশন ক্লাস যেটি আপনি রেসকিউ করতে চান।
এটি নির্ভর করে আপনি কী কোড রান করছেন।
IO-র জন্য:
- এটি হতে পারে
Errno::ENOENTমিসিং ফাইলের জন্য - অথবা
Errno::EACCESপারমিশন এররর জন্য
সबচেয়ে ভালো অংশ?
আপনি একই begin/rescue ব্লকে একাধিক এক্সেপশন হ্যান্ডল করতে পারেন।
এভাবে:
begin
IO.sysopen('/dev/null')
rescue Errno::ENOENT
puts "File not found."
rescue Errno::EACCES
puts "Insufficient permissions, not allowed to open file."
end
আপনি যদি একই অ্যাকশন একাধিক এক্সেপশনের জন্য হয়ে থাকতে চান…
আপনি এইভাবে করতে পারেন:
begin
IO.sysopen('/dev/null')
rescue Errno::ENOENT, Errno::EACCES
puts "There was an error opening the file."
end
আরো শিখি!
ব্লক ও মেথডের ভিতরে এক্সেপশন রেসকিউ কীভাবে করবেন
আপনাকে সবসময় begin কীওয়ার্ড ব্যবহার করতে হয় না।
কিছু কেস আছে যেখানে আপনি এটিকে বাদ দিতে পারেন।
কোথায়?
মেথড এবং ব্লকের ভিতরে।
উদাহরণ:
def get_null_device
IO.sysopen('/dev/null')
rescue Errno::ENOENT
puts "Can't open IO device."
end
মেথড ডেফিনিশন নিজে begin-এর কাজটি করে, তাই আপনি এটিকে অমিট করতে পারেন।
আপনি ব্লকের সাথেও এটি করতে পারেন।
উদাহরণ:
["a.txt", "b.txt", "c.txt"].map do |f|
IO.sysopen(f)
rescue Errno::ENOENT
puts "Can't open IO device: #{f}."
end
এখন, rescue কীওয়ার্ড begin ছাড়া ব্যবহার করার আরেকটি পথ রয়েছে।
চলুন দেখি সেটি কীভাবে কাজ করে।
ইনলাইন রেসকিউ বুঝা এবং কেন এটি বিপজ্জনক
আপনি rescue ইনলাইন ব্যবহার করতে পারেন।
কিছু রেয়ার সিনেরিওতে, আপনি এই এক্সেপশন হ্যান্ডলিং ফর্মটি উপকারী পেতে পারেন।
এখানে একটি উদাহরণ:
["a.txt", "b.txt", "c.txt"].select { |f| File.open(f) rescue nil }.map(&:size)
এটি আপনাকে শুধু যেসব ফাইল আছে সেগুলো খোলতে দেয় এবং যেগুলো নেই সেগুলো ইগনোর করতে দেয়।
ফলস্বরূপ, আপনি অস্তিত্বশীল ফাইলগুলোর সাইজ পান।
এক্সেপশন রেইজ হয়ে না।
কেন এটা করবেন?
ভালো, এটি আপনাকে আপনার কোড সব এক লাইনে রাখতে দেয়।
এটিই প্রায়।
এই rescue ফর্ম ব্যবহার করার সময় একটি "হিডেন ডেঞ্জার" রয়েছে কারণ আপনি StandardError-এর সব সাবক্লাস এক্সেপশন পাচ্ছেন।
যা অধিকাংশ এক্সেপশন।
এটি কেন NOT GOOD?
কারণ সফেসপিফিক এক্সেপশন হ্যান্ডল করা বেস্ট প্র্যাকটিস, একটি ব্রড সিলেকশনের বদলে।
এটি আপনাকে নিজের থেকে এররগুলো হাইড করতে থেকে বাঁচায়!
হিডেন এররগুলো সব ধরনের অদ্ভুত আচরণ এবং হার্ড-টু-ডিবাগ ইস্যু লীড করতে পারে।
সারসংক্ষেপ
আপনি রুবিতে এরর, বেসিক এক্সেপশন হ্যান্ডলিং এবং rescue / begin কীওয়ার্ড সম্পর্কে শিখেছেন।
এই আর্টিকেলটি উপকারী লাগলে শেয়ার করুন 🙂
পড়ার জন্য ধন্যবাদ!