Custom Exceptions তৈরি এবং হ্যান্ডল করা

Exception Handling (এক্সেপশন হ্যান্ডলিং) - রুবি প্রোগ্রামিং (Ruby Programming) - Computer Programming

240

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 ব্লকটি সব সময় কার্যকর হয়, ত্রুটি ঘটুক বা না ঘটুক।

কাস্টম এক্সসেপশন ব্যবহারের মাধ্যমে কোডে ত্রুটি বা ব্যতিক্রমের সঠিক পরিচালনা করা সম্ভব, যা কোডের কার্যকারিতা এবং রক্ষণাবেক্ষণ সহজ করে তোলে।

Content added By
Promotion

Are you sure to start over?

Loading...