একটি ব্যতিক্রম একটি বিশেষ ডেটা কাঠামো যা একটি অসাধারণ সম্পর্কে তথ্য রাখে আপনার আবেদনে ঘটছে অবস্থা। ব্যতিক্রম হল প্রেরিত সংকেত যখন আপনার প্রোগ্রামটি চালানো চালিয়ে যেতে পারে না কারণ এটি একটি নির্দিষ্ট পরিস্থিতির সাথে কীভাবে মোকাবিলা করতে হয় তা জানে না। রুবিতে, আমরা এই ধরনের সংকেত পাঠানোকে উত্থাপন বলি একটি ব্যতিক্রম।
raise 'this is an exception'
puts "This message won't be printed."
কর্মে একটি ব্যতিক্রম দেখার দ্রুততম উপায় হল নিজেকে বড় করা। raise
ব্যবহার করে একটি বার্তা সহ পদ্ধতি, রুবি একটি RuntimeError
তৈরি করবে এর বিবরণ হিসাবে পাস করা পাঠ্য সহ। এটি একটি স্ট্যাক ট্রেসও যোগ করবে যা আপনার কোডে ব্যতিক্রমটি কোথা থেকে উত্থাপিত হয়েছে তা নির্দেশ করে।
$ ruby raise.rb
raise.rb:1:in `<main>': 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 `<main>'
এই ক্ষেত্রে, ব্যতিক্রমের ধরন হল ZeroDivisionError
, RuntimeError
এর পরিবর্তে আমরা আগে দেখেছি। রুবির ব্যতিক্রম শ্রেণিবিন্যাস গঠনের জন্য কয়েক ডজন ব্যতিক্রম রয়েছে এবং সেগুলি বিভিন্ন পরিস্থিতিতে উত্থিত হয়েছে।
RuntimeError
একটি আরো সাধারণ ব্যতিক্রম ক্লাস, কিন্তু আরো নির্দিষ্ট উদাহরণ আছে। একটি NoMethodError
বিদ্যমান নেই এমন একটি পদ্ধতি কল করার চেষ্টা করার সময় উত্থাপিত হয় এবং একটি ArgumentError
নোট করে যে ভুল আর্গুমেন্টগুলি একটি বিদ্যমান পদ্ধতিতে প্রেরণ করা হয়, উদাহরণস্বরূপ।
উদ্ধার ব্যতিক্রম
বেশিরভাগ অ্যাপ্লিকেশনের ব্যতিক্রমগুলি থেকে পুনরুদ্ধার করার ক্ষমতা প্রয়োজন। একটি ওয়েব অ্যাপ্লিকেশনে, একটি ত্রুটি ঘটতে পারে যখন একজন ব্যবহারকারী একটি ফর্মে ত্রুটিপূর্ণ ডেটা জমা দেয়। এর ফলে পুরো ওয়েব সার্ভার ক্র্যাশ করার পরিবর্তে ব্যবহারকারীর কাছে একটি ত্রুটি বার্তা প্রদর্শিত হবে।
এই ধরনের ক্ষেত্রে, একটি ব্যতিক্রম উত্থাপিত হতে পারে, কিন্তু কল স্ট্যাকের শীর্ষে পৌঁছানোর আগে এটি ওয়েব সার্ভার দ্বারা উদ্ধার করা হবে, যা অ্যাপ্লিকেশনটি ক্র্যাশ হওয়া থেকে ব্যতিক্রমটিকে বাধা দেয়৷
begin
raise 'this is an exception'
rescue RuntimeError => exception
puts "Exception rescued: #{exception.inspect}"
# => "Exception rescued: #<RuntimeError: this is an exception>"
end
puts "This message *will* be printed."
একটি শুরু/উদ্ধার ব্লকে আগে থেকে উদাহরণটি মোড়ানোর মাধ্যমে, ব্যতিক্রমটি উত্থাপিত হবে না এবং এটি আমাদের অ্যাপটি ক্রাশ করবে না। পরিবর্তে, রেসকিউ-ব্লকটি কার্যকর করা হয়, যা এই ক্ষেত্রে ব্যতিক্রমটি ব্যর্থ হয়েছে ব্যাখ্যা করে একটি বার্তা প্রিন্ট করে। এছাড়াও, কারণ এটি আমাদের অ্যাপকে ক্র্যাশ হতে বাধা দেয়, শেষ বার্তাটি হবে মুদ্রিত হন।
এই উদাহরণটি বিশেষভাবে RuntimeError
থেকে উদ্ধার করে s, তাই অন্য কোনো ত্রুটি ধরা পড়বে না। কোন ত্রুটিগুলি উদ্ধার করা হয়েছে সে সম্পর্কে নির্দিষ্ট হওয়া সুবিধাজনক, কারণ বিভিন্ন ত্রুটি ঘটলে এটি আপনাকে বিভিন্ন জিনিস করার অনুমতি দেবে৷ এছাড়াও, অনেকগুলি ব্যতিক্রম উদ্ধার না করা নিশ্চিত করা গুরুত্বপূর্ণ৷
ব্যতিক্রম পরিচালনার বিষয়ে আরও গভীরভাবে প্রাইমারের জন্য, এবং কীভাবে ব্যতিক্রমগুলিকে সঠিকভাবে উদ্ধার করা যায় তার কিছু টিপসের জন্য, রুবি ম্যাজিকে আমাদের ব্যতিক্রম প্রাইমারটি দেখুন।
রুবিতে ব্যতিক্রম উত্থাপন বা ধরা সম্পর্কে কোন প্রশ্ন আছে? অনুগ্রহ করে আমাদের @AppSignal এ জানাতে দ্বিধা করবেন না। অবশ্যই, আমরা জানতে চাই যে আপনি এই নিবন্ধটি কেমন পছন্দ করেছেন, অথবা আপনার যদি অন্য কোনো বিষয় থাকে যে সম্পর্কে আপনি আরও জানতে চান।