রুবির দুটি পৃথক ব্যতিক্রম পদ্ধতি রয়েছে: নিক্ষেপ / ক্যাচ এবং উত্থাপন / রেসকিউ।
আমাদের দু'জন কেন?
আপনি কখন অন্যটি ব্যবহার করবেন না?
রুবির দুটি পৃথক ব্যতিক্রম পদ্ধতি রয়েছে: নিক্ষেপ / ক্যাচ এবং উত্থাপন / রেসকিউ।
আমাদের দু'জন কেন?
আপনি কখন অন্যটি ব্যবহার করবেন না?
উত্তর:
আমি মনে করি http://hasno.info/ruby-gotchas-and-caveats এর পার্থক্যের একটি শালীন ব্যাখ্যা রয়েছে:
ক্যাচ / থ্রো বাড়াতে / উদ্ধার করার মতো নয়। ক্যাচ / থ্রো আপনাকে দ্রুত ব্লকগুলি এমন এক জায়গায় ফিরে যেতে দেয় যেখানে একটি নির্দিষ্ট চিহ্নের জন্য ক্যাচ সংজ্ঞায়িত করা হয়, উদ্ধার বাড়াতে ব্যতিক্রমী বিষয়বস্তুতে জড়িত আসল ব্যতিক্রম হ্যান্ডলিং স্টাফ।
raiseখুব ব্যয়বহুল। throwএটি না. লুপ থেকে বেরিয়ে আসার জন্য throwব্যবহার হিসাবে ভাবেন goto।
raise, fail, rescue, এবং ensureহাতল ত্রুটি , নামেও পরিচিত ব্যতিক্রমthrowএবং catchহয় নিয়ন্ত্রণ প্রবাহঅন্যান্য ভাষার মতো নয়, রুবির থ্রো এবং ক্যাপ ব্যতিক্রমগুলির জন্য ব্যবহৃত হয় না। পরিবর্তে, যখন আর কোনও কাজের প্রয়োজন হয় না তখন এগুলি দ্রুত মৃত্যুদণ্ড কার্যকর করার একটি উপায় সরবরাহ করে। (গ্রিম, ২০১১)
whileলুপের মতো একক স্তরের নিয়ন্ত্রণ প্রবাহকে সমাপ্ত করে , একটি সাধারণ দিয়ে সম্পন্ন করা যেতে পারে return। নেস্টেড লুপের মতো নিয়ন্ত্রণের প্রবাহের অনেক স্তরের অবসান ঘটিয়ে কাজ করা যায় throw।
যখন জিনিসগুলি ভুল হয়ে যায় তখন মৃত্যুদন্ড কার্যকর করার জন্য তদারক করার জন্য উত্থাপন এবং উদ্ধারের ব্যতিক্রম প্রক্রিয়া দুর্দান্ত তবে সাধারণ প্রক্রিয়াজাতকরণের সময় কিছুটা গভীরভাবে বাসা বেঁধে বেরিয়ে আসতে সক্ষম হতে অনেক সময় চমৎকার। এখানেই ক্যাচ এন্ড থ্রো কাজে আসে। (টমাস এবং হান্ট, 2001)
https://coderwall.com/p/lhkkug/don-t-confuse-ruby-s-throw-statement-with-raise একটি দুর্দান্ত ব্যাখ্যা দেয় যা আমার সন্দেহ হয় যে আমি উন্নতি করতে পারি। সংক্ষেপে বলতে গেলে, ব্লগ পোস্ট থেকে কিছু কোডের নমুনাগুলি যাচ্ছি:
raise/ আপনি অন্যান্য ভাষা (বা পাইথনের / ) থেকে পরিচিত / rescueরচনাটির নিকটতম এনালগগুলি । যদি আপনি একটি ত্রুটিযুক্ত অবস্থার মুখোমুখি হয়ে থাকেন এবং আপনি এটি অন্য ভাষায় দেখতে চান তবে আপনার রুবি হওয়া উচিত ।throwcatchraiseexceptthrowraise
রুবি throw/ catchআপনাকে মৃত্যুদন্ড কার্যকর করতে এবং স্ট্যাকের উপরে উঠতে দেয় catch(যেমন raise/ করায় rescue) তবে ত্রুটির অবস্থার জন্য এটি আসলে বোঝানো হয়নি। এটি খুব কমই ব্যবহার করা উচিত, এবং কেবল তখনই যখন "আপনি যদি কোনও কোনও সন্ধান না করেন ততক্ষণ স্ট্যাক আপটি চালান catch" আচরণ আপনার লেখার যে অ্যালগরিদমটির জন্য অর্থবোধ করে তবে এটি throwকোনও ত্রুটির সাথে সম্পর্কিত হিসাবে মনে করা বুদ্ধিমান হবে না শর্ত।
রুবিতে কী কী ধরা এবং নিক্ষেপ করা হয়? throw/ catchনির্মাণের সুন্দর ব্যবহার সম্পর্কে কিছু পরামর্শ দেয় ।
তাদের মধ্যে কংক্রিট আচরণগত পার্থক্য অন্তর্ভুক্ত:
rescue FooFooসাবক্লাস সহ উদাহরণগুলি উদ্ধার করবে Foo। catch(foo)শুধুমাত্র একই জিনিসFoo ধরা হবে ,। এর catchউদাহরণগুলি ধরার জন্য আপনি কেবল কোনও শ্রেণির নাম পাস করতে পারবেন না , তবে এটি সমতার তুলনাও করবে না। এই ক্ষেত্রে
catch("foo") do
throw "foo"
end
আপনাকে একটি UncaughtThrowError: uncaught throw "foo"(বা ArgumentError২.২ এর আগে রুবির সংস্করণে) দেবে
একাধিক উদ্ধার ধারাগুলি তালিকাভুক্ত করা যেতে পারে ...
begin
do_something_error_prone
rescue AParticularKindOfError
# Insert heroism here.
rescue
write_to_error_log
raise
end
একাধিক catchএস নেস্ট করা প্রয়োজন যখন ...
catch :foo do
catch :bar do
do_something_that_can_throw_foo_or_bar
end
endএকটি খালি rescueসমতূল্য rescue StandardErrorএবং একটি কথ্য কনস্ট্রাক্ট হয়। একটি "খালি catch", এর মতো catch() {throw :foo}কখনও কিছুই ধরা দেয় না এবং ব্যবহার করা উচিত নয়।
gotoএ সি / সি ++ @docwhat যেমন উল্লেখ করেছেন, জাভা করেছে বিরতি লেবেল ও অবিরত । (পাইথনেরও এটির জন্য একটি প্রত্যাখ্যাত প্রস্তাব রয়েছে ))