কম্পিউটার টিউটোরিয়াল

রুবিতে নেস্টেড এক্সসেপশন দক্ষতা:.Exception#cause ব্যবহার করে নির্ভুল ত্রুটি হ্যান্ডলিং

রুবিতে একটি এক্সসেপশন রescue করে অন্য ধরনের এক্সসেপশন re-raise করা একটি সাধারণ প্যাটার্ন। ActionView এর এই বিষয়ে একটি স্পষ্ট উদাহরণ। একটি পূর্বের ব্লগ পোস্টে TracePoint সম্পর্কে আমি উল্লেখ করেছিলাম, ActionView আপনার টেমপ্লেটে যেকোনো এক্সসেপশন যেনি নিলে এবং সেগুলিকে ActionView::TemplateError হিসেবে re-raise করে।

কभी কখন এটি পর্যাপ্ত নয়। আপনাকে মূল এক্সসেপশনটি খুব জরুরি হতে পারে কারণ সেটিতে কিছু ডেটা থাকে যা সমস্যা সমাধানে সাহায্য করে। خوشখবর হলো, রুবি ২.১ থেকে আপনি এই কাজটি করতে পারেন Exception#cause মেথড ব্যবহার করে।

নেস্টেড ব্যাকট্রেস এবং কাস্টম অ্যাট্রিবিউট

#cause মেথড আসলে মূল এক্সসেপশন অবজেক্টটি রিটার্ন করে। এর মানে আপনি মূল এক্সসেপশনের যে কোনো মেটাডেটা অ্যাক্সেস করতে পারেন। আপনি মূল ব্যাকট্রেসটিও পেতে পারেন।

class EatingError < StandardError
  attr_reader :food
  def initialize(food)
    @food = food
  end
end

def fail_and_reraise
  raise EatingError.new("সুপ")
rescue
  raise RuntimeError
end

begin
  fail_and_reraise
rescue => e
  puts "#{ e } caused by #{ e.cause } while eating #{ e.cause.food }"
  puts e.cause.backtrace.first
end

অনন্ত এবং তার পরেও!

উপরোক্ত উদাহরণগুলো শুধুমাত্র একটি লেভেল গভীর, কিন্তু রুবিতে নেস্টেড এক্সসেপশন যেকোনো সংখ্যক লেভেল 가질 수 있습니다। আমি বিস্মিত হব যদি কেউ তিন বা চার লেভেলের চেয়ে বেশি গভীরে যায়।

...কিন্তু শুধু মজার জন্য আমি চেষ্টা করলাম ১০০ লেভেল গভীর একটি নেস্টেড এক্সসেপশন তৈরি করতে। এটি একটি বোকা কোডের টুকরো, এবং আমি আশা করি আপনি প্রোডাকশনে এর মতো কিছু কখনো দেখবেন না।

def recursively_raise(c=0)
  raise "Level #{ c }"
rescue => e
  if c < 100
    recursively_raise(c + 1)
  else
    recursively_print(e)
  end
end

def recursively_print(e)
  if e
    puts e
    recursively_print(e.cause)
  end
end

recursively_raise()
# ... নিচের আউটপুট প্রিন্ট করবে:
# Level 100
# Level 99
# Level 98
# ইত্যাদি।
  1. রুবিতে সিলেকশন সর্ট মাস্টার করুন: স্টেপ-বাই-স্টেপ ইমপ্লিমেন্টেশন

  2. রুবিতে লিনিয়ার রিগ্রেশন দিয়ে ট্রেন্ড ফোরকাস্টিং: একটি প্র্যাকটিক্যাল গাইড

  3. গুগল TCMalloc দিয়ে রুবির মেমরি অ্যালোকেশন প্রোফাইলিং

  4. রুবি পার্সিং মास্টার: স্ক্র্যাচ থেকে নিজস্ব পার্সার বানান