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

রুবি এক্সেপশন মাস্টার করুন: আত্মবিশ্বাসের সাথে এরর হ্যান্ডলিং

একটি এক্সেপশন একটি স্পেশাল ডেটা স্ট্রাকচার যা আপনার অ্যাপ্লিকেশনে একটি এক্সেপশনাল কন্ডিশন ঘটার তথ্য ধারণ করে। এক্সেপশনগুলো সিগন্যাল যা পাঠানো হয় যখন আপনার প্রোগ্রাম চালানোরაგো চলে না কারণ সেটি কীভাবে একটি নির্দিষ্ট পরিস্থিতি ডील করতে হয় সেটা জানে না। রুবিতে, আমরা এমন সিগন্যাল পাঠাকে রেইজিং এক্সেপশন বলি।

raise 'this is an exception'
puts "This message won't be printed."

এক্সেপশন একশনে देखनेর সবচেয়ে দ্রুত উপায় হচ্ছে নিজে একটা রেইজ করা। raise মেথড একটি মেসেজ দিয়ে ব্যবহার করলে, রুবি একটি RuntimeError তৈরি করে পাস করা টেক্সটকে ডেসক্রিপশন হিসেবে। এটা একটি স্ট্যাক ট্রেস ও যোগ করে যা পয়েন্ট করে এক্সেপশনটি আপনার কোডে কোথা থেকে রেইজ হয়েছে।

$ ruby raise.rb
raise.rb:1:in `
': this is an exception (RuntimeError)

উপরের উদাহরণ স্ক্রিপ্ট রান করলে, আপনি লক্ষ্য করবেন, প্রতিশ্রুতির মতো, এক্সেপশন রেইজ হওয়ার পর মেসেজ প্রিন্ট হয়নি। এর কারণ হলো অনহ্যান্ডলড এক্সেপশন আপনার প্রোগ্রামের এক্সিকিউশন থামিয়ে দেয় একটি ক্র্যাশ করে। এটা নিশ্চিত করতে যে আপনার অ্যাপ্লিকেশন তার একটি টাস্ক সম্পন্ন করতে ব্যর্থ হলে চলতে থাকে না।

বিভিন্ন ধরনের এক্সেপশন

ইন্টারন্যালি, রুবি এক্সেপশন রেইজ করে যখন কিছু ভুল হয়। উদাহরণস্বরূপ, আপনি একটি এক্সেপশন পাবেন যখন একটি সংখ্যা শূন্য দিয়ে ভাগ করার চেষ্টা করবেন।

irb(main):001:0> 42/0
ZeroDivisionError: divided by 0
  from (irb):1:in `/'
  from (irb):1
  from /Users/jeff/.asdf/installs/ruby/2.3.0/bin/irb:11:in `
'

এই কেসে, এক্সেপশনের টাইপ ZeroDivisionError, আগের RuntimeError নয়। ডজনাগুলো এক্সেপশন টাইপ রুবির এক্সেপশন হায়ারার্কি তৈরি করে, এবং সেগুলো বিভিন্ন পরিস্থিতিতে রেইজ হয়।

RuntimeError একটি আরো জেনেরিক এক্সেপশন ক্লাস, কিন্তু আরও স্পেসিফিক উদাহরণ রয়েছে। NoMethodError রেইজ হয় যখন একটি অস্তিত্বহীন মেথড কল করার চেষ্টা করা হয়, এবং ArgumentError নোট করে যে ভুল আর্গুমেন্ট পাস করা হয়েছে একটি এক্সিস্টিং মেথডে।

এক্সেপশন রেসকিউ করা

অধিকাংশ অ্যাপ্লিকেশনে এক্সেপশন থেকে রিকভার করার ক্ষমতা দরকার। একটি ওয়েব অ্যাপ্লিকেশনে, একটি এরর হতে পারে যখন একজন ইউজার একটি ফর্মে ফল্টি ডেটা সাবমিট করে। এর ফলাফল হলো ইউজারের কাছে একটি এরর মেসেজ দেখানো, পুরো ওয়েব সার্ভার ক্র্যাশ করার বদলে।

ऐকেসে, একটি এক্সেপশন রেইজ হতে পারে, কিন্তু সেটি ওয়েব সার্ভার tarafından রেসকিউ হয়ে যাবে কল স্ট্যাকের শীর্ষে পৌঁছানোর আগে, যা এক্সেপশনকে অ্যাপ্লিকেশন ক্র্যাশ করতে থেকে বাঁচায়।

begin
  raise 'this is an exception'
rescue RuntimeError => exception
  puts "Exception rescued: #{exception.inspect}"
  # => "Exception rescued: #"
end
puts "This message *will* be printed."

আগের উদাহরণকে begin/rescue ব্লকে র‍্যাপ করলে, এক্সেপশন রেইজ হবena, এবং অ্যাপ ক্র্যাশ করবena। বদলে, rescue-ব্লক এক্সিকিউট হবে, যা এক্সেপশন থয়ার্টেড হয়েছে এমন একটি মেসেজ প্রিন্ট করবে, এই কেসে। এছাড়া, কারণ এটা অ্যাপ ক্র্যাশ হতে বাঁচায়, লাস্ট মেসেজ প্রিন্ট হবে।

এই উদাহরণ স্পেসিফিক্যালি RuntimeError রেসকিউ করে, তাই অন্য কোনো এরর ক্যাচ হবena। স্পেসিফিক হওয়া কনভেনিয়েন্ট, কারণ এটা আপনাকে ভিন্ন এরর হলে ভিন্ন কিছু করার সুযোগ দেয়। এছাড়া, খুব বেশি এক্সেপশন রেসকিউ না করার বিষয়ে সতর্ক থাকা গুরুত্বপূর্ণ।

এক্সেপশন হ্যান্ডলিং নিয়ে আরও গভীর প্রাইমার এবং কিছু টিপস পেতে, আমাদের রুবি ম্যাজিকের এক্সেপশন প্রাইমার চেক আউট করুন।

রুবিতে এক্সেপশন রেইজ বা ক্যাচ নিয়ে কোন প্রশ্ন আছে? দয়া করে @AppSignal-এ আমাদের জানান। অবশ্যই, আমরা জানতে চাই আপনি এই আর্টিকেল কেমন লাগলো, বা অন্য কোন বিষয়ে জানতে চান।

  1. প্রাইরে এক্সেপশন হ্যান্ডলিং মাস্টার করুন: রেলস কনসোলে অ্যাডভান্সড টেকনিক

  2. রুবিতে কাস্টোম এক্সেপশন মাস্টার করুন: ধাপে ধাপে গাইড

  3. রুবি এক্সেপশনে কনটেক্সচুয়াল ডেটা যোগ করুন: একটি প্র্যাক্টিক্যাল গাইড

  4. রুবি এক্সসেপশন দক্ষতা TracePoint দিয়ে: জটিল ত্রুটি পরিস্থিতি ডায়াগনোসिस