একটি রেইজড এক্সেপশন রেসকিউ করা যায় যাতে সেটি কল স্ট্যাকের শীর্ষে পৌঁছালে আপনার অ্যাপ্লিকেশন ক্র্যাশ না করে। রুবিতে, আমরা এর জন্য rescue কীওয়ার্ড ব্যবহার করি।
রুবিতে এক্সেপশন রেসকিউ করার সময়, আপনি একটি স্পেসিফিক এরর ক্লাস স্পেসিফাই করতে পারেন যা রেসকিউ করা উচিত।
begin
raise 'This exception will be rescued!'
rescue StandardError => e
puts "Rescued: #{e.inspect}"
end
নোট: raise এক্সেপশন ক্লাস ছাড়া ব্যবহার করলে, রুবি ডিফল্টভাবে RuntimeError ব্যবহার করে।
একটি একক এক্সেপশন ক্লাস রেসকিউ করার পাশাপাশি, আপনি rescue কীওয়ার্ডে এক্সেপশন ক্লাসের একটি অ্যারে পাস করতে পারেন। এটা আপনাকে একাধিক এরর একইভাবে হ্যান্ডল করতে দেয়।
begin
raise 'This exception will be rescued!'
rescue StandardError, AnotherError => e
puts "Rescued: #{e.inspect}"
end
একাধিক rescue ব্লক ব্যবহার করা যায় ভিন্ন এরর ভিন্নভাবে হ্যান্ডল করার জন্য। এটি লাইব্রেরির সাথে কাজ করার সময় উপকারী হয় যা ভিন্ন পরিস্থিতির জন্য ভিন্ন এক্সেপশন প্রোডিউস করে।
begin
raise 'This exception will be rescued!'
rescue StandardError => e
puts "Rescued: #{e.inspect}"
rescue AnotherError => e
puts "Rescued, but with a different block: #{e.inspect}"
end
এক্সেপশন হায়ারার্কি
রুবির এক্সেপশন হায়ারার্কি বিভিন্ন ধরনের এরর আলাদা করার জন্য ব্যবহৃত হয়, একসাথে আপনাকে একটি গ্রুপ এরর থেকে রেসকিউ করার ক্ষমতা দিয়ে যাতে সবগুলো স্পেসিফাই না করতে হয়।
যদিও লাইব্রেরিগুলো নিজস্ব এক্সেপশন সাবক্লাস ডিফাইন করতে পারে, রুবি ২.৫-এ বিল্ট-ইন এক্সেপশন সাবক্লাসের তালিকা এভাবে দেখে:
- NoMemoryError
- ScriptError
- LoadError
- NotImplementedError
- SyntaxError
- SecurityError
- SignalException
- Interrupt
- StandardError (default for `rescue`)
- ArgumentError
- UncaughtThrowError
- EncodingError
- FiberError
- IOError
- EOFError
- IndexError
- KeyError
- StopIteration
- LocalJumpError
- NameError
- NoMethodError
- RangeError
- FloatDomainError
- RegexpError
- RuntimeError (default for `raise`)
- SystemCallError
- Errno::*
- ThreadError
- TypeError
- ZeroDivisionError
- SystemExit
- SystemStackError
- fatal (impossible to rescue)
rescue ব্লকে এক্সেপশন ক্লাস ওমিট করলে, StandardError অনুমান করা হয়। কারণ ArgumentError এবং NoMethodError StandardError এর সাবক্লাস, এগুলো রেসকিউ হয় যখন ব্লকে ঘটে।
SystemCallError কীভাবে এক্সেপশন হায়ারার্কি কাজ করে সেটার একটি ভালো উদাহরণ। এটি একটি লো-লেভেল প্ল্যাটফর্ম-ডিপেন্ডেন্ট এক্সেপশন ক্লাস। এটা সবচেয়ে বেশি দেখা যায় ফাইল পড়া বা লিখার সময়।
রুবির File.read মেথড এক্সেপশন রেইজ করবে যদি ফাইল পড়তে ব্যর্থ হয়। সেটি অনেক কারণেই হতে পারে, যেমন ফাইল এক্সিস্ট না করে বা প্রোগ্রামের সঠিক পারমিশন নেই পড়তে।
যেহেতু এই সমস্যাগুলো প্ল্যাটফর্ম-ডিপেন্ডেন্ট, রুবি ভিন্ন অপারেটিং সিস্টেমের জন্য ভিন্ন এক্সেপশন রেইজ করতে পারে। এই লো-লেভেল এররের জন্য, রুবি প্রতিটি প্ল্যাটফর্মের জন্য আলাদা Errno::*-এক্সেপশন তালিকা ইমপ্লিমেন্ট করে।
এই সব Errno::* এক্সেপশন SystemCallError এর সাবক্লাস। যদিও এগুলো প্ল্যাটফর্ম-স্পেসিফিক, সেগুলো একসাথে rescue ব্লকে ব্যবহার করা যায় SystemCallError রেসকিউ করে।
begin
File.read("does/not/exist")
rescue SystemCallError => e
puts "Rescued: #{e.inspect}"
end
এক্সেপশন নিগল जाना
সাধারণত, এক্সেপশন রেসকিউ করার সময় যতটা সম্ভব স্পেসিফিক হওয়া ভালো, অনিচ্ছাকৃত এক্সেপশন নিগল যাওয়া থেকে বাঁচতে।
image = nil
begin
File.read(image.filename)
rescue
puts "File can't be read!"
end
এই উদাহরণে, image ভেরিয়েবল nil, তাই #filename কল করার সময় NoMethodError রেইজ করে (NoMethodError: undefined method `filename' for nil:NilClass)। কারণ প্রতিটি StandardError সাবক্লাস রেসকিউ হয় (যার মধ্যে NoMethodError রয়েছে), এক্সেপশন নিগল जातা ہے এবং "File can't be read!" মেসেজ প্রিন্ট হয়। এটা কোডে একটি সম্ভাব্য বাগ লুকিয়ে রাখে।
নোট: যদিও সম্ভব, rescue ব্লকে Exception সুপারক্লাস ব্যবহার করা অত্যন্ত নিরুৎসাহিত করা হয়।
রুবিতে এক্সেপশন রেইজ বা রেসকিউ নিয়ে কোন প্রশ্ন আছে? দয়া করে @AppSignal-এ আমাদের জানান। অবশ্যই, আমরা জানতে চাই আপনি এই আর্টিকেল কেমন লাগলো, বা অন্য কোন বিষয়ে জানতে চান।