ruby - রুবি মধ্যে ব্যতিক্রম ব্যতিক্রম বজায় রাখা ব্যতিক্রম মধ্যে পার্থক্য কি?




exception (2)

রুবি দুটি ভিন্ন ব্যতিক্রম প্রক্রিয়া আছে: ফাঁস / ধরা এবং উত্থাপন / রেসকিউ।

কেন আমরা দুই আছে?

যখন আপনি এক ব্যবহার করা উচিত নয় এবং অন্য?


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

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


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

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

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

    Ruby জন্য ধরা এবং নিক্ষেপ কি? throw / catch গঠন ভাল ব্যবহার কিছু পরামর্শ প্রস্তাব।

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

  • rescue Foo Foo subclasses সহ Foo উদাহরণ উদ্ধার করবে। catch(foo) শুধুমাত্র একই বস্তু ধরা হবে , Foo । আপনি এটির দৃষ্টান্ত catch শুধুমাত্র একটি ক্লাসের নাম catch পারবেন না, তবে এটি সমতা তুলনাও করবে না। এই ক্ষেত্রে

    catch("foo") do
      throw "foo"
    end

    আপনাকে একটি UncaughtThrowError: uncaught throw "foo" দিতে হবে UncaughtThrowError: uncaught throw "foo" (2.2 এর আগে রুবি সংস্করণে একটি ArgumentError )

  • একাধিক রেসকিউ ক্লজ তালিকাভুক্ত করা যাবে ...

    begin
      do_something_error_prone
    rescue AParticularKindOfError
      # Insert heroism here.
    rescue
      write_to_error_log
      raise
    end

    যখন একাধিক catch Es nested করা প্রয়োজন ...

    catch :foo do
      catch :bar do
        do_something_that_can_throw_foo_or_bar
      end
    end
  • একটি বেয়ার rescue rescue StandardError ইরাক rescue StandardError সমতুল্য এবং একটি নির্বোধ গঠন। একটি "বেয়ার catch ", catch() {throw :foo} , কিছু ধরা হবে না এবং এটি ব্যবহার করা উচিত নয়।







exception