ডিআরওয়াই ফ্যাশনে একাধিক ত্রুটি শ্রেণি রুবিয়ের উদ্ধার দফায় পাস করা


102

আমার কিছু কোড রয়েছে যা রুবিতে একাধিক ধরণের ব্যতিক্রম উদ্ধার করতে হবে:

begin
  a = rand
  if a > 0.5
    raise FooException
  else
    raise BarException
  end
rescue FooException, BarException
  puts "rescued!"
end

আমি যা করতে চাই তা হ'ল যে কোনওভাবে ব্যতিক্রম প্রকারের তালিকাটি সংরক্ষণ করতে চাই যা আমি কোথাও উদ্ধার করতে চাই এবং সেই ধরণের রেসকিউ ক্লোজে পৌঁছে দিতে পারি:

EXCEPTIONS = [FooException, BarException]

এবং তারপর:

rescue EXCEPTIONS

এটি কি এমনকি সম্ভব, এবং কিছু হ্যাক-ওয়াই কল করা ছাড়া এটি কি সম্ভব eval? আমি TypeError: class or module required for rescue clauseউপরোক্ত চেষ্টা করার সময় আমি দেখতে পাচ্ছি বলে আশাবাদী না ।


4
রেসকিউ * ছাড়ের কী হবে?
রোমান

উত্তর:


201

আপনি স্প্ল্যাট অপারেটরের সাথে একটি অ্যারে ব্যবহার করতে পারেন *

EXCEPTIONS = [FooException, BarException]

begin
  a = rand
  if a > 0.5
    raise FooException
  else
    raise BarException
  end
rescue *EXCEPTIONS
  puts "rescued!"
end

আপনি যদি উপরে (সহ EXCEPTIONS) অ্যারের জন্য একটি ধ্রুবক ব্যবহার করতে যাচ্ছেন তবে নোট করুন যে আপনি এটি একটি সংজ্ঞায়নের সাথে সংজ্ঞা দিতে পারবেন না, এবং আপনি যদি এটি অন্য কোনও শ্রেণিতে সংজ্ঞায়িত করেন তবে আপনাকে এটির নামের স্থানটি উল্লেখ করতে হবে। আসলে, এটি একটি ধ্রুবক হতে হবে না।


স্প্ল্যাট অপারেটর

স্প্ল্যাট অপারেটর *একটি অ্যারে তার অবস্থানে "আনপ্যাক করে" যাতে এটি

rescue *EXCEPTIONS

মানে একই

rescue FooException, BarException

আপনি এটি অ্যারে আক্ষরিক হিসাবেও ব্যবহার করতে পারেন

[BazException, *EXCEPTIONS, BangExcepion]

যা হিসাবে একই

[BazException, FooException, BarException, BangExcepion]

বা একটি যুক্তি পজিশনে

method(BazException, *EXCEPTIONS, BangExcepion)

যার অর্থ

method(BazException, FooException, BarException, BangExcepion)

[] শূন্যতায় প্রসারিত:

[a, *[], b] # => [a, b]

রুবি 1.8 এবং রুবি 1.9 এর মধ্যে একটি পার্থক্য রয়েছে nil

[a, *nil, b] # => [a, b]       (ruby 1.9)
[a, *nil, b] # => [a, nil, b]  (ruby 1.8)

যে বিষয়গুলির উপর to_aসংজ্ঞা দেওয়া আছে to_aসেগুলি সম্পর্কে সতর্ক থাকুন , যেমন যেমন ক্ষেত্রে প্রয়োগ করা হবে:

[a, *{k: :v}, b] # => [a, [:k, :v], b]

অন্যান্য ধরণের বস্তুর সাথে এটি নিজেই ফিরে আসে।

[1, *2, 3] # => [1, 2, 3]

4
এটি রুবি 1.8.7 তেও কাজ করে বলে মনে হচ্ছে। এক্ষেত্রে '*' চরিত্রটি ব্যবহার করার জন্য শব্দটি কী EXCEPTIONS? আরও কিছু শিখতে চাই।
এপিবি

4
@ অ্যান্ডি এটি splat বলা হয়। এটি সাধারণত কমা দ্বারা পৃথক করা বস্তুগুলিতে একটি অ্যারের দ্রবীভূতকরণের প্রভাব রাখে। যখন কোনও পদ্ধতির সংজ্ঞার অবস্থান গ্রহণ করার জন্য আর্গুমেন্ট ব্যবহার করা হয়, এটি অন্যভাবে করে: আর্গুমেন্টগুলিকে একটি অ্যারেতে রাখে। এটি বিভিন্ন অনুষ্ঠানে বেশ কার্যকর। এটি 1.8.7 এর সাথে কাজ করে তা জেনে রাখা ভাল। আমি আমার উত্তর অনুসারে সম্পাদনা করেছি।
সাওয়া

21
মনে রাখবেন আপনি ব্যতিক্রম দৃষ্টান্ত অ্যাক্সেস করতে চান, তাহলে এই সিনট্যাক্স ব্যবহার করুন: rescue InvalidRequestError, CardError => e(দেখুন mikeferrier.com/2012/05/19/... )
পিটার এরলিচ

4
এই বাক্য গঠনটি ঠিক ঠিক কাজ করে:, ব্যতিক্রম শ্রেণীর নামের একটি অ্যারে rescue *EXCEPTIONS => eকোথায় EXCEPTIONS
aks

4

@ সাবাবার দেওয়া উত্তর প্রযুক্তিগতভাবে সঠিক হলেও , আমি মনে করি এটি রুবির ব্যতিক্রম হ্যান্ডলিং প্রক্রিয়াটিকে অপব্যবহার করেছে।

পিটার এহরিলিচের মন্তব্য অনুসারে ( মাইক ফেরিয়ারের একটি পুরাতন ব্লগ পোস্টের দিকে ইঙ্গিত করে ), রুবি ইতিমধ্যে একটি ডিআরওয়াই ব্যতিক্রম হ্যান্ডলার প্রক্রিয়াতে সজ্জিত রয়েছে:

puts 'starting up'
begin
  case rand(3)
  when 0
    ([] + '')
  when 1
    (foo)
  when 2
    (3 / 0)
  end
rescue TypeError, NameError => e
  puts "oops: #{e.message}"
rescue Exception => e
  puts "ouch, #{e}"
end
puts 'done'

এই কৌশলটি ব্যবহার করে, আমরা ব্যতিক্রম বস্তুটি অ্যাক্সেস করতে পারি, যার মধ্যে সাধারণত কিছু মূল্যবান তথ্য থাকে has


1

আমি কেবল এই ইস্যুতে দৌড়ে গিয়েছিলাম এবং একটি বিকল্প সমাধান পেয়েছি। আপনার FooExceptionএবং BarExceptionসমস্তগুলি কাস্টম ব্যতিক্রম শ্রেণি হতে চলেছে এবং বিশেষত যদি সেগুলি সমস্ত তাত্ত্বিকভাবে সম্পর্কিত হয় তবে আপনি আপনার উত্তরাধিকারের স্তরক্রমটি এমনভাবে গঠন করতে পারেন যে তারা সকলেই একই পিতা-মাতার শ্রেণীর কাছ থেকে উত্তরাধিকারী হবে এবং তারপরে কেবল পিতামাতার শ্রেণিকে উদ্ধার করবে।

উদাহরণ হিসেবে বলা যায় আমি তিনটি ব্যতিক্রম ছিল: FileNamesMissingError, InputFileMissingError, এবং OutputDirectoryErrorযে আমি এক বিবৃতি দিয়ে উদ্ধার করতে চেয়েছিলেন। আমি আর একটি ব্যতিক্রম শ্রেণি বলা হয়েছিল FileLoadErrorএবং এর উত্তরাধিকার সূত্রে উপরের তিনটি ব্যতিক্রম সেট আপ করেছি। আমি তখনই উদ্ধার করি FileLoadError

এটার মত:

class FileLoadError < StandardError
end

class FileNamesMissingError < FileLoadError
end

class InputFileMissingError < FileLoadError
end

class OutputDirectoryError < FileLoadError
end

[FileNamesMissingError,
 InputFileMissingError,
 OutputDirectoryError].each do |error| 
   begin  
     raise error
   rescue FileLoadError => e
     puts "Rescuing #{e.class}."
   end 
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.