কম্পিউটার

Rubys ব্যতিক্রম বনাম StandardError:পার্থক্য কি?

"কখনও রুবিতে ব্যতিক্রম উদ্ধার করবেন না!"

হয়তো আপনি এটা আগে শুনেছেন. এটি ভাল পরামর্শ, কিন্তু আপনি ইতিমধ্যেই জানেন না থাকলে এটি বেশ বিভ্রান্তিকর। আসুন এই বিবৃতিটি ভেঙে দেখি এবং এর অর্থ কী।

আপনি সম্ভবত জানেন যে রুবিতে, আপনি এর মতো ব্যতিক্রমগুলি উদ্ধার করতে পারেন:

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

  1. হোয়াটসঅ্যাপ ক্লিয়ার চ্যাট বনাম চ্যাট মুছুন:পার্থক্য কী?

  2. TCP বনাম UDP — পার্থক্য কি এবং কোন প্রোটোকল দ্রুত?

  3. OneDrive এবং OneDrive for Business এর মধ্যে পার্থক্য কি?

  4. Windows 10 Home এবং Pro এর মধ্যে পার্থক্য কি?