রুবিতে এক্সেপশন, অনেক ভাষার মতোই, অপ্রত্যাশিত ঘটনা মোকাবিলার একটি উপায় দেয়। আপনার প্রোগ্রাম যাতে ক্র্যাশ না করে তা প্রতিরোধ করতে চাইলে এক্সেপশন সঠিকভাবে সামলানো গুরুত্বপূর্ণ।
যখন কোনো এক্সেপশন রেইজ করা হয়, তা আপনি নিজে রেইজ করুন বা রুবি ইন্টারপ্রেটার রেইজ করুক, প্রোগ্রামটি স্বাভাবিক কাজকর্ম থামিয়ে দেয় এবং শেষে একটি এরর বার্তা নিয়ে বন্ধ হয়ে যায়:
raise ArgumentError.new("Something went wrong!")
=> Traceback (most recent call last):
.
.
ArgumentError (Something went wrong!)
1/0
=> Traceback (most recent call last):
.
.
ZeroDivisionError (divided by 0)
এই বন্ধ হয়ে যাওয়ার প্রক্রিয়াটি থামাতে চাইলে আমাদের এক্সেপশনের প্রতি সাড়া দিতে হবে। এটাকেই এক্সেপশন "রেসকিউ" করা বলা হয়:
begin
# ...any code that raises an exception
rescue
puts 'Got an exception'
end
এই প্রোগ্রামটি ক্র্যাশ করবে না এবং এটি "Got an exception" আউটপুট দেবে। বন্ধ হয়ে যাওয়ার বদলে রুবি rescue ব্লকের কোডটি চালায়, যা একটি বার্তা প্রিন্ট করে।
রুবিতে সবকিছুর মতো এক্সেপশনও অবজেক্ট, আর এরা সাধারণত এক্সেপশন সম্পর্কিত ডেটা ধরে রাখে। এভাবেই আমরা এক্সেপশন অবজেক্টটি পেতে পারি:
begin
# ...any code that raises an exception
rescue => e
puts "Exception class: #{ e.class.name }"
puts "Exception Message:#{e.message}"
end
রুবিতে নিজের এক্সেপশন রেইজ করাও সম্ভব। যেমন:
begin
raise ArgumentError.new("Invalid argument")
rescue ArgumentError => e
puts e.message
end
আগের এক্সেপশনটি রুবির বিল্ট-ইন এক্সেপশনগুলোর একটি, তবে কাস্টম এক্সেপশন ডিফাইন করে সেগুলো রেইজ করাও সম্ভব:
class CustomError < StandardError
end
raise CustomError.new("Something went wrong")
এই অনুশীলনীতে আপনি একটি সাধারণ ক্যালকুলেটরের জন্য এরর হ্যান্ডলিং তৈরি করবেন।
লক্ষ্য হলো এমন একটি কার্যকর ক্যালকুলেটর তৈরি করা, যা 16, 51 এবং + আর্গুমেন্ট দেওয়া হলে নিচের প্যাটার্নের একটি স্ট্রিং রিটার্ন করে: 16 + 51 = 67।
SimpleCalculator.calculate(16, 51, "+")
# => "16 + 51 = 67"
SimpleCalculator.calculate(32, 6, "*")
# => "32 * 6 = 192"
SimpleCalculator.calculate(512, 4, "/")
# => "512 / 4 = 128"
calculate
এই কাজে যে মূল মেথডটি বাস্তবায়ন করতে হবে সেটি হলো SimpleCalculator.calculate() ক্লাস মেথডটি।
এটি তিনটি আর্গুমেন্ট নেয়।
প্রথম দুটি আর্গুমেন্ট হলো এমন সংখ্যা, যেগুলোর উপর একটি অপারেশন চালানো হবে।
তৃতীয় আর্গুমেন্টটি স্ট্রিং টাইপের, এবং এই অনুশীলনীতে নিচের অপারেশনগুলো বাস্তবায়ন করা প্রয়োজন:
+ স্ট্রিং দিয়ে যোগ* স্ট্রিং দিয়ে গুণ/ স্ট্রিং দিয়ে ভাগঅজানা অপারেশন চিহ্নের জন্য UnsupportedOperation এক্সেপশন রেইজ করতে SimpleCalculator.calculate() মেথডটি হালনাগাদ করুন।
SimpleCalculator.calculate(1, 2, '-')
# => Raises an UnsupportedOperation
এই অনুশীলনীতে আপনি UnsupportedOperation এক্সেপশনটি একটি নির্দিষ্ট স্কোপের জন্য ডিফাইন করবেন বলে আশা করা হচ্ছে।
অবৈধ আর্গুমেন্ট টাইপের জন্য ArgumentError এক্সেপশন রেইজ করতে SimpleCalculator.calculate() মেথডটি হালনাগাদ করুন।
SimpleCalculator.calculate(1, '2', '*')
# => Raises an ArgumentError
ZeroDivisionError এক্সেপশনগুলো হ্যান্ডেল করতে SimpleCalculator.calculate() হালনাগাদ করুন।
হ্যান্ডলিং কোডটি Division by zero is not allowed. কনটেন্টসহ স্ট্রিংটি রিটার্ন করবে।
অন্য কোনো এক্সেপশন SimpleCalculator.calculate() মেথড দ্বারা হ্যান্ডেল করা উচিত নয়।
SimpleCalculator.calculate(512, 0, "/")
# => returns "Division by zero is not allowed."
Exercism-এ সাইন আপ করুন, Ruby ট্র্যাকের 21টি কনসেপ্ট121টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।