রুবিতে ব্যতিক্রম ছুঁড়ে দেওয়া ব্যতিক্রমগুলির মধ্যে পার্থক্য কী?


167

রুবির দুটি পৃথক ব্যতিক্রম পদ্ধতি রয়েছে: নিক্ষেপ / ক্যাচ এবং উত্থাপন / রেসকিউ।

আমাদের দু'জন কেন?

আপনি কখন অন্যটি ব্যবহার করবেন না?


অনেক প্রোগ্রামিং ভাষায় "নেস্টেড লুপগুলি থেকে বেরিয়ে আসা" একটি সাধারণ প্রয়োজন। এছাড়া gotoসি / সি ++ @docwhat যেমন উল্লেখ করেছেন, জাভা করেছে বিরতি লেবেল ও অবিরত । (পাইথনেরও এটির জন্য একটি প্রত্যাখ্যাত প্রস্তাব রয়েছে ))
ফ্র্যাঙ্কলিন ইউ

উত্তর:


104

আমি মনে করি http://hasno.info/ruby-gotchas-and-caveats এর পার্থক্যের একটি শালীন ব্যাখ্যা রয়েছে:

ক্যাচ / থ্রো বাড়াতে / উদ্ধার করার মতো নয়। ক্যাচ / থ্রো আপনাকে দ্রুত ব্লকগুলি এমন এক জায়গায় ফিরে যেতে দেয় যেখানে একটি নির্দিষ্ট চিহ্নের জন্য ক্যাচ সংজ্ঞায়িত করা হয়, উদ্ধার বাড়াতে ব্যতিক্রমী বিষয়বস্তুতে জড়িত আসল ব্যতিক্রম হ্যান্ডলিং স্টাফ।


1
জানতে আগ্রহী ... আইপ্যাড থেকে এটি পড়া, তাই তাদেরকে 1.9 এ পরীক্ষা করতে পারবেন না, তবে এই কয়েকটি গ্যাচচা এখনকার রুবি সংস্করণে বৈধ নয়, তাই না?
ডেনিস ডি বার্নার্ডি

12
এছাড়াও জানার মূল্য: raiseখুব ব্যয়বহুল। throwএটি না. লুপ থেকে বেরিয়ে আসার জন্য throwব্যবহার হিসাবে ভাবেন goto
ডকচ্যাট

4
@ ডেনিস আপনি কোন গোছা উল্লেখ করছেন?
ডক্টটি

1
লিংকটা ভেঙে গেছে!
morhook

দেখুন রুবি ক্যাচ-নিক্ষেপ এবং দক্ষতা কর্মক্ষমতা পার্থক্য সম্পর্কে আরো বুঝতে।
ফ্রাঙ্কলিন ইউ

109
  • raise, fail, rescue, এবং ensureহাতল ত্রুটি , নামেও পরিচিত ব্যতিক্রম
  • throwএবং catchহয় নিয়ন্ত্রণ প্রবাহ

অন্যান্য ভাষার মতো নয়, রুবির থ্রো এবং ক্যাপ ব্যতিক্রমগুলির জন্য ব্যবহৃত হয় না। পরিবর্তে, যখন আর কোনও কাজের প্রয়োজন হয় না তখন এগুলি দ্রুত মৃত্যুদণ্ড কার্যকর করার একটি উপায় সরবরাহ করে। (গ্রিম, ২০১১)

whileলুপের মতো একক স্তরের নিয়ন্ত্রণ প্রবাহকে সমাপ্ত করে , একটি সাধারণ দিয়ে সম্পন্ন করা যেতে পারে return। নেস্টেড লুপের মতো নিয়ন্ত্রণের প্রবাহের অনেক স্তরের অবসান ঘটিয়ে কাজ করা যায় throw

যখন জিনিসগুলি ভুল হয়ে যায় তখন মৃত্যুদন্ড কার্যকর করার জন্য তদারক করার জন্য উত্থাপন এবং উদ্ধারের ব্যতিক্রম প্রক্রিয়া দুর্দান্ত তবে সাধারণ প্রক্রিয়াজাতকরণের সময় কিছুটা গভীরভাবে বাসা বেঁধে বেরিয়ে আসতে সক্ষম হতে অনেক সময় চমৎকার। এখানেই ক্যাচ এন্ড থ্রো কাজে আসে। (টমাস এবং হান্ট, 2001)

তথ্যসূত্র

  1. গ্রিম, আভিদি "ছোঁড়া, ধর, উঠাও, উদ্ধার কর ... আমি খুব বিভ্রান্ত!" রুবিলিয়ারিং ব্লগ। এনপি, 11 জুলাই 2011. ওয়েব। 1 জানুয়ারী। 2012. http://rubylearning.com/blog/2011/07/12/throw-catch-raise-rescue--im-so-confused/
  2. টমাস, ডেভ এবং অ্যান্ড্রু হান্ট। "প্রোগ্রামিং রুবি।" : প্র্যাকমেটিক প্রোগ্রামার গাইড। এনপি, 2001. ওয়েব। 29 সেপ্টেম্বর 2015. http://ruby-doc.com/docs/ProgrammingRuby/html/tut_exferences.html

2
আড্ডিকে পডকাস্টে শুনে মনে হচ্ছে না
hrdwdmrbl

2
রুবি লার্নিং লিঙ্কটি কাজ করছে বলে মনে হচ্ছে না। পার্থক্যগুলি নিয়ে আলোচনা করে এমন একটি ব্লগ পোস্ট এখানে দেওয়া হয়েছে: ড্যানিয়েলচেনজাইক.github.io/blog/2013/10/23/throw-raise
ডেনিস

মজাদার, রুবেলার্নিং ডট কম মনে করে যে অবির নিবন্ধটি এখনও আছে । আমি অনুমান করি এজন্য আমরা এতগুলি স্টাফগুলিকে এসও-তে কপি করি, সুতরাং এটি হারাবে না!
জ্যারেড বেক

21

https://coderwall.com/p/lhkkug/don-t-confuse-ruby-s-throw-statement-with-raise একটি দুর্দান্ত ব্যাখ্যা দেয় যা আমার সন্দেহ হয় যে আমি উন্নতি করতে পারি। সংক্ষেপে বলতে গেলে, ব্লগ পোস্ট থেকে কিছু কোডের নমুনাগুলি যাচ্ছি:

  1. raise/ আপনি অন্যান্য ভাষা (বা পাইথনের / ) থেকে পরিচিত / rescueরচনাটির নিকটতম এনালগগুলি । যদি আপনি একটি ত্রুটিযুক্ত অবস্থার মুখোমুখি হয়ে থাকেন এবং আপনি এটি অন্য ভাষায় দেখতে চান তবে আপনার রুবি হওয়া উচিত ।throwcatchraiseexceptthrowraise

  2. রুবি throw/ catchআপনাকে মৃত্যুদন্ড কার্যকর করতে এবং স্ট্যাকের উপরে উঠতে দেয় catch(যেমন raise/ করায় rescue) তবে ত্রুটির অবস্থার জন্য এটি আসলে বোঝানো হয়নি। এটি খুব কমই ব্যবহার করা উচিত, এবং কেবল তখনই যখন "আপনি যদি কোনও কোনও সন্ধান না করেন ততক্ষণ স্ট্যাক আপটি চালান catch" আচরণ আপনার লেখার যে অ্যালগরিদমটির জন্য অর্থবোধ করে তবে এটি throwকোনও ত্রুটির সাথে সম্পর্কিত হিসাবে মনে করা বুদ্ধিমান হবে না শর্ত।

    রুবিতে কী কী ধরা এবং নিক্ষেপ করা হয়? throw/ catchনির্মাণের সুন্দর ব্যবহার সম্পর্কে কিছু পরামর্শ দেয় ।

তাদের মধ্যে কংক্রিট আচরণগত পার্থক্য অন্তর্ভুক্ত:

  • rescue FooFooসাবক্লাস সহ উদাহরণগুলি উদ্ধার করবে Foocatch(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}কখনও কিছুই ধরা দেয় না এবং ব্যবহার করা উচিত নয়।


ভাল ব্যাখ্যা তবে প্রশ্ন উত্থাপন করে, কেন তারা পৃথিবীতে রুবি বা অন্য ভাষায় উত্সাহিত করবে। এবং তারপরে নিক্ষেপ তবে এটি অন্তর্ভুক্ত করুন = অন্য ভাষায় ফেলে দিন। আমি তাদের আসল যুক্তিটি দেখতে পাচ্ছি না
তারে0000

@ তারযুক্ত 100 ( শ্রাগ ।) আমি একমত যে আজকের অন্যান্য জনপ্রিয় ভাষার তুলনায় এটি বেশ অভিনব বলে মনে হচ্ছে।
মার্ক আমেরিকা

2
@ ওয়্যারড০০: ১৯60০ এর দশকে কাঠামোগত ত্রুটি পরিচালনার প্রথম পরীক্ষার পর থেকেই একে "উত্থাপন" বলে একটি ব্যতিক্রম বলা হয়ে থাকে, এটি ব্যতিক্রম হ্যান্ডলিংয়ের আধুনিক রূপ আবিষ্কার করে এমন সেমিনাল নিবন্ধগুলিতে একটি ব্যতিক্রম বলা হয়, একে বলা হয় লিসপস এবং স্মলটাল্কসে "ব্যতিক্রম" আপত্তি, যা রুবির অন্যতম প্রধান অনুপ্রেরণা ছিল এবং এটি "ব্যতিক্রমীকরণ" বা হার্ডওয়্যারে একটি বাধা "উত্থাপন" বলা হয়, যেখানে "প্রোগ্রামিংয়ের ধারণার আগেই ধারণাটি বিদ্যমান ছিল" ভাষা "বিদ্যমান। বরং প্রশ্নটি হওয়া উচিত: কেন এই অন্যান্য ভাষাগুলি এটি বদলেছিল?
J:18rg ডব্লু মিটাগ

@ মার্ক অ্যামেরি: মনে রাখবেন যে এই "অন্যান্য জনপ্রিয় ভাষাগুলি" অনেকগুলিই রুবির চেয়ে কম বয়সী বা কমপক্ষে সমসাময়িক। সুতরাং, প্রশ্নটি বরং হওয়া উচিত: কেন এই অন্যান্য ভাষাগুলি রুবি (এবং স্মলটালক এবং লিস্প এবং হার্ডওয়্যার এবং সাহিত্য) অনুসরণ করে না?
Jörg ডব্লু মিটাগ

@ জার্গডব্লিউমিটাগ আকর্ষণীয় - আপনি আমাকে একটু historicalতিহাসিক গবেষণা করতে অনুপ্রাণিত করেছিলেন। রুবি আসার এক বছর আগে সি ++ এর "ছোঁড়া" ধারণা ছিল এবং ইংরেজী . stackexchange.com/a/449209/73974 অনুসারে শব্দটি আসলে 70 এর দশকে ফিরে যায় ... তাই আমি মনে করি আমরা এখনও রুবির সমালোচনা করতে পারি প্রতিষ্ঠিত পরিভাষা গ্রহণ করা এবং একে সম্পূর্ণ আলাদা বোঝার জন্য এটি ব্যবহার করা।
মার্ক আমেরিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.