Custom Exceptions বা ব্যক্তিগত ব্যতিক্রম (exception) রুবি প্রোগ্রামিং ভাষায় তৈরি করা সম্ভব, যা ব্যবহারকারীর প্রয়োজনীয়তা অনুযায়ী নির্দিষ্ট ত্রুটি বা ব্যতিক্রম তৈরি করে। রুবিতে Exception ক্লাসটি সব ধরনের ত্রুটি ধারণ করে, এবং আপনি এই ক্লাসটি সম্প্রসারণ (inherit) করে নিজের কাস্টম ত্রুটি তৈরি করতে পারেন।
১. Custom Exception তৈরি করা
রুবিতে custom exceptions তৈরি করতে, আপনি Exception ক্লাসকে এক্সটেন্ড করে একটি নতুন ক্লাস তৈরি করবেন। এরপর, আপনার কাস্টম ত্রুটির নাম ব্যবহার করে নির্দিষ্ট শর্তে ত্রুটি উত্তোলন করতে পারবেন।
Syntax:
class CustomError < StandardError
# Custom error logic
endএখানে, StandardError হলো রুবির ডিফল্ট Exception ক্লাস, যা সাধারণত ব্যবহার করা হয়। আপনি চাইলে এটি পরিবর্তন করতে পারেন, তবে সাধারণত এটি ব্যবহার করা হয়।
উদাহরণ:
class MyCustomError < StandardError
def initialize(msg = "A custom error occurred")
super(msg) # StandardError এর constructor কল করা হচ্ছে
end
end
# Raising the custom exception
begin
raise MyCustomError, "Something went wrong"
rescue MyCustomError => e
puts "Caught error: #{e.message}"
endআউটপুট:
Caught error: Something went wrongএখানে, MyCustomError নামে একটি কাস্টম ত্রুটি তৈরি করা হয়েছে, যা StandardError থেকে ইনহেরিট করছে। আমরা raise কমান্ড দিয়ে এই কাস্টম ত্রুটিটি উত্থাপন করেছি এবং rescue ব্লক দিয়ে ত্রুটিটি ধরেছি।
২. Custom Exception এর সাথে কাজ করা
যখন আপনি Custom Exception তৈরি করবেন, তখন তাতে আরো কাস্টম মেসেজ বা নির্দিষ্ট ফিল্ড যোগ করতে পারেন। এছাড়া, আপনি সেই ত্রুটি সম্পর্কে আরও বিস্তারিত তথ্যও যোগ করতে পারেন।
উদাহরণ:
class InvalidAgeError < StandardError
def initialize(msg = "Invalid age value provided")
super(msg)
end
end
def check_age(age)
raise InvalidAgeError, "Age must be a positive number" if age <= 0
puts "Age is valid"
end
begin
check_age(-5)
rescue InvalidAgeError => e
puts "Error: #{e.message}"
endআউটপুট:
Error: Age must be a positive numberএখানে, InvalidAgeError একটি কাস্টম ত্রুটি তৈরি করেছে যা শুধুমাত্র নির্দিষ্ট শর্ত (যেমন বয়সের মান ঋণাত্মক বা শূন্য) পূর্ণ হলে ত্রুটি উত্থাপন করে। raise দিয়ে সেই ত্রুটি উত্থাপন করা হয়েছে এবং rescue ব্লকে এটি ধরা হয়েছে।
৩. Custom Exception এ আরও ডেটা যুক্ত করা
আপনি কাস্টম এক্সসেপশনের মধ্যে অতিরিক্ত ডেটা সংরক্ষণ করতে পারেন, যেমন ত্রুটির কোড বা ট্রেস (stack trace)।
উদাহরণ:
class FileProcessingError < StandardError
attr_reader :file_name, :error_code
def initialize(file_name, error_code, msg = "File processing failed")
@file_name = file_name
@error_code = error_code
super(msg)
end
end
def process_file(file_name)
raise FileProcessingError.new(file_name, 404, "File not found") unless File.exist?(file_name)
puts "Processing file..."
end
begin
process_file("non_existent_file.txt")
rescue FileProcessingError => e
puts "Error: #{e.message}"
puts "File: #{e.file_name}"
puts "Error Code: #{e.error_code}"
endআউটপুট:
Error: File not found
File: non_existent_file.txt
Error Code: 404এখানে, FileProcessingError কাস্টম এক্সসেপশনটির মধ্যে ফাইলের নাম এবং ত্রুটির কোড ধারণ করা হচ্ছে। যখন ত্রুটি উত্থাপন করা হয়, তখন সেই ডেটা e.file_name এবং e.error_code দিয়ে অ্যাক্সেস করা হয়।
৪. Custom Exception এর সাথে ensure ব্যবহার
ensure ব্লক ব্যবহার করে আপনি এমন কোড চালাতে পারেন যা ত্রুটি ঘটুক বা না ঘটুক, নিশ্চয়ই চালানো হবে। এটি সাধারণত ক্লিনআপ (যেমন ফাইল বন্ধ করা, সংযোগ বিচ্ছিন্ন করা ইত্যাদি) করার জন্য ব্যবহার করা হয়।
উদাহরণ:
class DatabaseError < StandardError; end
def connect_to_database
raise DatabaseError, "Unable to connect to database" if rand > 0.5
puts "Connected to database"
end
begin
connect_to_database
rescue DatabaseError => e
puts "Error: #{e.message}"
ensure
puts "Closing database connection..."
endআউটপুট (ধরা যাক ত্রুটি ঘটেছে):
Error: Unable to connect to database
Closing database connection...এখানে, ensure ব্লকটি নিশ্চিত করবে যে, ত্রুটি ঘটুক বা না ঘটুক, "Closing database connection..." মেসেজটি অবশ্যই আউটপুট হবে।
৫. Multiple Custom Exceptions Handling
রুবিতে একাধিক কাস্টম এক্সসেপশন একত্রে ধরাও সম্ভব, যা বিভিন্ন ধরনের ত্রুটি একত্রে হ্যান্ডল করতে সাহায্য করে।
উদাহরণ:
class NotFoundError < StandardError; end
class UnauthorizedError < StandardError; end
def fetch_data(status)
if status == 404
raise NotFoundError, "Data not found"
elsif status == 401
raise UnauthorizedError, "Unauthorized access"
else
puts "Data fetched successfully"
end
end
begin
fetch_data(404)
rescue NotFoundError => e
puts "Error: #{e.message}"
rescue UnauthorizedError => e
puts "Error: #{e.message}"
endআউটপুট:
Error: Data not foundএখানে, NotFoundError এবং UnauthorizedError দুটি আলাদা কাস্টম এক্সসেপশন তৈরি করা হয়েছে এবং এগুলোর জন্য আলাদা আলাদা rescue ব্লক ব্যবহৃত হয়েছে।
সারসংক্ষেপ
- Custom Exceptions তৈরি করতে আপনি Exception ক্লাস থেকে ইনহেরিট করতে পারেন এবং নতুন কাস্টম ত্রুটি ক্লাস তৈরি করতে পারেন।
raiseকমান্ড ব্যবহার করে আপনি কাস্টম এক্সসেপশন উত্তোলন করতে পারেন এবংrescueব্লক দিয়ে ত্রুটিগুলি ধরা হয়।- কাস্টম এক্সসেপশনে অতিরিক্ত তথ্য (যেমন ত্রুটির কোড, ফাইল নাম ইত্যাদি) অন্তর্ভুক্ত করা যায়।
ensureব্লকটি সব সময় কার্যকর হয়, ত্রুটি ঘটুক বা না ঘটুক।
কাস্টম এক্সসেপশন ব্যবহারের মাধ্যমে কোডে ত্রুটি বা ব্যতিক্রমের সঠিক পরিচালনা করা সম্ভব, যা কোডের কার্যকারিতা এবং রক্ষণাবেক্ষণ সহজ করে তোলে।
Read more