উত্তর:
প্রযুক্তিগতভাবে, প্রথমটি সেট করা বার্তাটি সহ একটি রানটাইম ইরার উত্থাপন করে "foo"
এবং দ্বিতীয়টি বার্তাটিতে সেট করে একটি ব্যতিক্রম উত্থাপন করে "foo"
।
ব্যবহারিকভাবে, আপনি কখন প্রাক্তনটি ব্যবহার করতে চান এবং কখন আপনি আধুনিক ব্যবহার করতে চান তার মধ্যে একটি উল্লেখযোগ্য পার্থক্য রয়েছে।
সহজ ভাবে বললে, আপনি সম্ভবত একটি চান RuntimeError
একটি না Exception
। তর্ক ছাড়াই একটি উদ্ধারকারী ব্লক ধরবে RuntimeErrors
, তবে তা ধরবে না Exception
। সুতরাং আপনি যদি আপনার কোডটিতে একটি উত্থাপন করেন তবে Exception
এই কোডটি এটি ধরবে না:
begin
rescue
end
ধরার জন্য Exception
আপনাকে এই কাজটি করতে হবে:
begin
rescue Exception
end
এর অর্থ একটি অর্থে, একটি Exception
একটি এর চেয়ে "খারাপ" ত্রুটিRuntimeError
কারণ এটি থেকে পুনরুদ্ধার করতে আপনাকে আরও কাজ করতে হবে।
আপনি যা চান তা নির্ভর করে আপনার প্রকল্পটি কীভাবে ত্রুটি পরিচালনা করে। উদাহরণস্বরূপ, আমাদের ডেমনগুলিতে, প্রধান লুপটিতে একটি ফাঁকা উদ্ধার রয়েছে যা ধরা পড়বে RuntimeErrors
, তাদের প্রতিবেদন করবে এবং তারপরে চালিয়ে যাবে। তবে এক বা দুটি পরিস্থিতিতে আমরা চাই যে डेমনটি সত্যই কোনও ত্রুটিতে মারা যায়, এবং সেই ক্ষেত্রে আমরা একটি উত্থাপন করিException
যা আমাদের "স্বাভাবিক ত্রুটি পরিচালনা করার কোড" এর বাইরে চলে যায়।
এবং আবারও, আপনি যদি লাইব্রেরি কোড লিখছেন, আপনি সম্ভবত একটি চান RuntimeError
না Exception
, কারণ আপনার লাইব্রেরির ব্যবহারকারীরা যদি কোনও ত্রুটি উত্থাপন করে যে কোনও ফাঁকা rescue
ব্লক ধরতে পারে না, তা অবাক করে দেবে এবং কেন তা বুঝতে তাদের কিছুটা সময় লাগবে।
পরিশেষে, আমার বলা উচিত যে এটি শ্রেণীর RuntimeError
একটি সাবক্লাস StandardError
, এবং আসল নিয়মটি হ'ল যদিও আপনি যে raise
কোনও ধরণের অবজেক্ট করতে পারেন , rescue
ফাঁকাটি ডিফল্টরূপে কেবলমাত্র যা কিছু পেয়ে যায় তা পেতে পারে StandardError
। বাকি সব সুনির্দিষ্ট হতে হবে।
StandardError
। এটি কয়েকটি লাইনের চেয়ে বেশি জটিল হওয়ার দরকার নেই class MissingArgumentsError < StandardError; end
।
raise
raise( string )
raise( exception [, string [, array ] ] )
কোনও যুক্তি ছাড়াই, ব্যাতিক্রমটি উত্থাপন করে $!
বা শূন্য RuntimeError
হলে একটি উত্থাপন করে $!
। একক String
যুক্তি RuntimeError
দিয়ে এটি স্ট্রিং সহ একটি বার্তা হিসাবে উত্থাপন করে । অন্যথায়, প্রথম প্যারামিটারটি কোনও Exception
শ্রেণীর নাম (বা এমন কোনও বস্তু যা Exception
প্রেরণ ব্যতিক্রম পাঠিয়ে দেয়) হওয়া উচিত। Alচ্ছিক দ্বিতীয় প্যারামিটারটি ব্যতিক্রমের সাথে সম্পর্কিত বার্তাটি সেট করে এবং তৃতীয় প্যারামিটারটি কলব্যাক তথ্যের একটি অ্যারে। ব্যতিক্রমগুলি begin...end
ব্লকগুলির রেসকিউ ক্লাস দ্বারা ধরা পড়ে ।
raise "Failed to create socket"
raise ArgumentError, "No parameters", caller
RuntimeError < StandardError < Exception
[2] সুতরাং যে কোড দ্বিতীয় ব্লক করবে উভয় একটি ব্যতিক্রম এবং RuntimeError [3] ধরা এটি আকর্ষণীয় / অদ্ভুত যে "বেয়ার" উত্থাপন এবং উদ্ধার ঘটে সেই নির্দিষ্ট ব্যতিক্রমের সাথে কাজ করার জন্য [4] সম্ভবত থাম্বের নিয়মটি ক্লায়েন্ট কোডে রানটাইমআরার উত্থাপন করা, তবে নিজের কোডের অভ্যন্তরে নিজের কাস্টম ব্যতিক্রম বাড়াতে এবং উদ্ধার করতে পারে?