"উত্থাপন" foo "` এবং "উত্থাপন ব্যতিক্রম। নতুন" ("foo") between মধ্যে পার্থক্য কি?


103

প্রযুক্তিগত, দার্শনিক, ধারণাবাদী বা অন্যথায় - এর মধ্যে পার্থক্য কী

raise "foo"

এবং

raise Exception.new("foo")

?

উত্তর:


121

প্রযুক্তিগতভাবে, প্রথমটি সেট করা বার্তাটি সহ একটি রানটাইম ইরার উত্থাপন করে "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। বাকি সব সুনির্দিষ্ট হতে হবে।


2
খুব তথ্যপূর্ণ, ধন্যবাদ। কিছু বিষয়: [1] শেষ অনুচ্ছেদ সবচেয়ে আলোকজ্জ্বল, এবং আমাকে দিন irb কিছু উল্লেখ না এ আবিষ্কার ছিল যে: RuntimeError < StandardError < Exception[2] সুতরাং যে কোড দ্বিতীয় ব্লক করবে উভয় একটি ব্যতিক্রম এবং RuntimeError [3] ধরা এটি আকর্ষণীয় / অদ্ভুত যে "বেয়ার" উত্থাপন এবং উদ্ধার ঘটে সেই নির্দিষ্ট ব্যতিক্রমের সাথে কাজ করার জন্য [4] সম্ভবত থাম্বের নিয়মটি ক্লায়েন্ট কোডে রানটাইমআরার উত্থাপন করা, তবে নিজের কোডের অভ্যন্তরে নিজের কাস্টম ব্যতিক্রম বাড়াতে এবং উদ্ধার করতে পারে?
জন বাচির

1
[১, ২] হ্যাঁ [3] নিশ্চিত নয় ... [4] আমি যখন আমার সর্বাধিক পেশাদারকে কোড করি, তখন আমি কাস্টম ত্রুটির প্রকারগুলি তৈরি করি যা উত্তরাধিকার সূত্রে প্রাপ্ত হয় StandardError। এটি কয়েকটি লাইনের চেয়ে বেশি জটিল হওয়ার দরকার নেই class MissingArgumentsError < StandardError; end
ড্যানিয়েল লুক্রাফট

অত্যন্ত তথ্যবহুল, তবে লাইব্রেরি লেখার ক্ষেত্রে রান টাইম ত্রুটিটি যদি অগ্রাধিকার দেওয়া হয় তবে রান টাইম ত্রুটির পরিবর্তে আপনি কোন ধরণের পরিস্থিতিতে একটি ব্যতিক্রম ছুঁড়ে ফেলতে চান?
চিহং ইউ

35

অফিকাল ডকুমেন্টেশন থেকে:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.