"কখনও রুবিতে ব্যতিক্রম উদ্ধার করবেন না!"
হয়তো আপনি এটা আগে শুনেছেন. এটি ভাল পরামর্শ, কিন্তু আপনি ইতিমধ্যেই জানেন না থাকলে এটি বেশ বিভ্রান্তিকর। আসুন এই বিবৃতিটি ভেঙে দেখি এবং এর অর্থ কী।
আপনি সম্ভবত জানেন যে রুবিতে, আপনি এর মতো ব্যতিক্রমগুলি উদ্ধার করতে পারেন:
begin
do_something()
rescue => e
puts e # e is an exception object containing info about the error.
end
এবং আপনি ত্রুটির ক্লাসনেম প্রদান করে নির্দিষ্ট ত্রুটি উদ্ধার করতে পারেন।
begin
do_something()
rescue ActiveRecord::RecordNotFound => e
puts e # Only rescues RecordNotFound exceptions, or classes that inherit from RecordNotFound
end
রুবির প্রতিটি ধরনের ব্যতিক্রম শুধু একটি ক্লাস। উপরের উদাহরণে, ActiveRecord::RecordNotFound হল একটি ক্লাসের নাম যা নির্দিষ্ট নিয়ম অনুসরণ করে।
এটি গুরুত্বপূর্ণ কারণ যখন আপনি RecordNotFound
উদ্ধার করেন , আপনি এটি থেকে উত্তরাধিকারসূত্রে পাওয়া যেকোন ব্যতিক্রমগুলিও উদ্ধার করেন৷
কেন আপনার ব্যতিক্রমটি উদ্ধার করা উচিত নয়
Exception
উদ্ধারে সমস্যা এটি আসলে Exception
থেকে উত্তরাধিকারসূত্রে পাওয়া প্রতিটি ব্যতিক্রমকে উদ্ধার করে . যা....সবই!
এটি একটি সমস্যা কারণ কিছু ব্যতিক্রম রয়েছে যা রুবি দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত হয়। আপনার অ্যাপের সাথে তাদের কিছু করার নেই এবং সেগুলিকে গিলে ফেললে খারাপ জিনিস ঘটবে৷
এখানে বড় কিছু আছে:
-
SignalException::Interrupt - আপনি যদি এটি উদ্ধার করেন, তাহলে আপনি কন্ট্রোল-সি টিপে আপনার অ্যাপ থেকে প্রস্থান করতে পারবেন না।
-
ScriptError::SyntaxError - সিনট্যাক্স ত্রুটিগুলি গ্রাস করার অর্থ হল
puts("Forgot something)
নীরবে ব্যর্থ হবে। -
NoMemoryError - আপনার প্রোগ্রামটি সমস্ত র্যাম ব্যবহার করার পরেও চলতে থাকলে কী হবে তা জানতে চান? আমিও না।
begin
do_something()
rescue Exception => e
# Don't do this. This will swallow every single exception. Nothing gets past it.
end
আমি অনুমান করছি যে আপনি সত্যিই এই সিস্টেম-স্তরের ব্যতিক্রমগুলির কোনটি গ্রাস করতে চান না। আপনি শুধুমাত্র আপনার অ্যাপ্লিকেশন স্তর ত্রুটি সব ধরতে চান. ব্যতিক্রমগুলি আপনার কোডের কারণ।
ভাগ্যক্রমে, এটি করার একটি সহজ উপায় রয়েছে৷
এর পরিবর্তে স্ট্যান্ডার্ড ত্রুটি উদ্ধার করুন
StandardError
থেকে উত্তরাধিকারসূত্রে যে সমস্ত ব্যতিক্রমগুলি আপনার যত্ন নেওয়া উচিত . এরা আমাদের পুরানো বন্ধু:
-
কোন পদ্ধতি ত্রুটি - উত্থাপিত হয় যখন আপনি এমন একটি পদ্ধতি চালু করার চেষ্টা করেন যা বিদ্যমান নেই
-
TypeError -
1 + ""
এর মতো জিনিসগুলির কারণে সৃষ্ট -
রানটাইম ত্রুটি - ভাল পুরানো রানটাইম ত্রুটি কে ভুলতে পারে?
এই ধরনের ত্রুটিগুলি উদ্ধার করতে, আপনি StandardError
উদ্ধার করতে চাইবেন৷ . আপনি এই মত কিছু লিখে এটি করতে পারেন:
begin
do_something()
rescue StandardError => e
# Only your app's exceptions are swallowed. Things like SyntaxErrror are left alone.
end
কিন্তু রুবি এটাকে ব্যবহার করার জন্য অনেক সহজ করে দিয়েছে।
আপনি যখন কোনো ব্যতিক্রম শ্রেণী নির্দিষ্ট করেন না, তখন রুবি ধরে নেয় আপনি StandardError মানে। তাই নিচের কোডটি উপরের কোডের অনুরূপ:
begin
do_something()
rescue => e
# This is the same as rescuing StandardError
end
কাস্টম ব্যতিক্রমগুলি StandardError থেকে উত্তরাধিকারসূত্রে পাওয়া উচিত
আপনি যদি নিজের কাস্টম ব্যতিক্রমগুলি তৈরি করেন তাহলে আপনার জন্য এর অর্থ কী?
এর মানে হল আপনার সবসময় StandardError
থেকে উত্তরাধিকারী হওয়া উচিত , এবং কখনও Exception
থেকে . ব্যতিক্রম থেকে উত্তরাধিকারী হওয়া খারাপ কারণ এটি উদ্ধারের প্রত্যাশিত আচরণকে ভেঙে দেয়। লোকেরা মনে করবে যে তারা সমস্ত অ্যাপ্লিকেশন-স্তরের ত্রুটিগুলি উদ্ধার করছে কিন্তু আপনার কেবলমাত্র যাত্রা হবে৷
class SomethingBad < StandardError
end
raise SomethingBad
ব্যতিক্রম গাছ
যেহেতু রুবির ব্যতিক্রমগুলি একটি শ্রেণির উত্তরাধিকারীতে প্রয়োগ করা হয়েছে, তাই এটি স্থাপন করা দেখতে সহায়ক হতে পারে। রুবির স্ট্যান্ডার্ড লাইব্রেরির সাথে শিপ করা ব্যতিক্রম ক্লাসের একটি তালিকা নিচে দেওয়া হল। রেলের মতো তৃতীয় পক্ষের রত্নগুলি এই চার্টে অতিরিক্ত ব্যতিক্রম ক্লাস যুক্ত করবে, তবে তারা সবগুলি এই তালিকার কিছু ক্লাস থেকে উত্তরাধিকারী হবে৷
Exception
NoMemoryError
ScriptError
LoadError
NotImplementedError
SyntaxError
SignalException
Interrupt
StandardError
ArgumentError
IOError
EOFError
IndexError
LocalJumpError
NameError
NoMethodError
RangeError
FloatDomainError
RegexpError
RuntimeError
SecurityError
SystemCallError
SystemStackError
ThreadError
TypeError
ZeroDivisionError
SystemExit
fatal