ruby on rails - রুবি শুরু, রেসকিউ এবং নিশ্চিত?




ruby-on-rails exception (5)

FYI, rescue বিভাগে একটি ব্যতিক্রম পুনঃ-উত্থাপিত হলেও, পরবর্তী ব্যতিক্রম হ্যান্ডলারের জন্য কোড এক্সিকিউশনটি চালিয়ে যাওয়ার আগে ensure ব্লকটি কার্যকর হবে। এই ক্ষেত্রে:

begin
  raise "Error!!"
rescue
  puts "test1"
  raise # Reraise exception
ensure
  puts "Ensure block"
end

আমি সম্প্রতি রুবি প্রোগ্রামিং শুরু করেছি, এবং আমি ব্যতিক্রম হ্যান্ডলিং খুঁজছেন।

finally সি # র রুবি সমতুল্য কিনা ensure আমি ভাবছিলাম! আমার কি উচিত:

file = File.open("myFile.txt", "w")

begin
  file << "#{content} \n"
rescue
  #handle the error here
ensure
  file.close unless file.nil?
end

অথবা আমি এটা করতে হবে?

#store the file
file = File.open("myFile.txt", "w")

begin
  file << "#{content} \n"
  file.close
rescue
  #handle the error here
ensure
  file.close unless file.nil?
end

একটি ব্যতিক্রম উত্থাপিত হয় না, এমনকি যদি কোন ব্যাপার কি বলা ensure না?


কেন আমাদের ensure দরকার:

def hoge
  begin
    raise
  rescue  
    raise # raise again
  ensure  
    puts 'ensure' # will be executed
  end  
  puts 'end of func' # never be executed
end  


হ্যাঁ, ensure হোন যে এটি প্রতিবার চালানো হয়, তাই আপনাকে file.close প্রয়োজন নেই। begin ব্লকটিতে বন্ধ করুন।

যাইহোক, পরীক্ষা করার একটি ভাল উপায় হল:

begin
  # Raise an error here
  raise "Error!!"
rescue
  #handle the error here
ensure
  p "=========inside ensure block"
end

আপনি একটি ব্যতিক্রম আছে যখন "========= ব্লক নিশ্চিত করতে" কিনা তা দেখতে পরীক্ষা করতে পারেন। তারপরে আপনি এমন বিবৃতিটি মন্তব্য করতে পারেন যা ত্রুটিটি উত্থাপন করে এবং কোনও কিছু মুদ্রিত হলে তা ensure করে ensure বিবৃতি কার্যকর করা হয় কিনা তা দেখুন।


হ্যাঁ, কোড সর্বদা মূল্যায়ন ensure করে ensure নিশ্চিত করুন। কেন এটা ensure বলা হয়। সুতরাং, এটি জাভা এবং সি # এর finally সমান।

begin / rescue / else / ensure / end সাধারণ প্রবাহ এই রকম দেখাচ্ছে:

begin
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
rescue SomeOtherException => some_other_variable
  # code that deals with some other exception
else
  # code that runs only if *no* exception was raised
ensure
  # ensure that this code always runs, no matter what
  # does not change the final value of the block
end

আপনি rescue করতে পারেন, ensure বা else । আপনি আপনার ব্যতিক্রম হ্যান্ডলিং কোডের ব্যতিক্রমটি পরিদর্শন করতে সক্ষম হবেন না এমন কোনও ভেরিয়েবলগুলি ছেড়ে যেতে পারেন। (ওয়েল, আপনি সর্বদা আপলোড হওয়া শেষ ব্যতিক্রমটি অ্যাক্সেস করতে গ্লোবাল ব্যতিক্রম পরিবর্তনশীল ব্যবহার করতে পারেন তবে এটি একটি সামান্য হ্যাকি।) এবং আপনি ব্যতিক্রম শ্রেণীটি ছেড়ে যেতে পারেন, সেই ক্ষেত্রে StandardError থেকে প্রাপ্ত সমস্ত ব্যতিক্রম ধরা পড়বে। (দয়া করে মনে রাখবেন যে ব্যতিক্রমগুলি ধরা পড়ে না কারণ ব্যতিক্রমগুলি ব্যতিক্রম যা উদাহরণস্বরূপ নয় তবে StandardError SystemStackError নয়। বেশিরভাগ গুরুতর ব্যতিক্রমগুলি যা SystemStackError NoMemoryError SystemStackError , NoMemoryError , SecurityError NotImplementedError , LoadError , LoadError , ScriptError , ScriptError , Interrupt , SignalException বা SystemExit ।)

কিছু ব্লক অন্তর্নির্মিত ব্যতিক্রম ব্লক গঠন। উদাহরণস্বরূপ, পদ্ধতি সংজ্ঞাগুলি নিখরচায় ব্যতিক্রম ব্লক, তাই লেখার পরিবর্তে

def foo
  begin
    # ...
  rescue
    # ...
  end
end

আপনি শুধু লিখুন

def foo
  # ...
rescue
  # ...
end

অথবা

def foo
  # ...
ensure
  # ...
end

একই class সংজ্ঞা এবং module সংজ্ঞা প্রযোজ্য।

যাইহোক, নির্দিষ্ট ক্ষেত্রে আপনি সম্পর্কে জিজ্ঞাসা করা হয়, আসলে একটি অনেক ভাল ছদ্মবেশ আছে। সাধারণভাবে, যখন আপনি কিছু সংস্থানের সাথে কাজ করেন যা আপনাকে শেষ পর্যন্ত পরিষ্কার করতে হবে, আপনি এমন একটি পদ্ধতিতে ব্লকটি পাস করে যা আপনার জন্য সমস্ত ক্লিনআপ করে। এটি C # তে using ব্লকের অনুরূপ, রুবি আসলে যথেষ্ট শক্তিশালী যে আপনাকে মাইক্রোসফটের উচ্চ যাজক পর্বত থেকে নেমে আসতে এবং অনুগ্রহপূর্বক আপনার জন্য তাদের কম্পাইলার পরিবর্তন করার জন্য অপেক্ষা করতে হবে না। রুবিতে, আপনি এটি নিজেরাই বাস্তবায়ন করতে পারেন:

# This is what you want to do:
File.open('myFile.txt', 'w') do |file|
  file.puts content
end

# And this is how you might implement it:
def File.open(filename, mode='r', perm=nil, opt=nil)
  yield filehandle = new(filename, mode, perm, opt)
ensure
  filehandle&.close
end

এবং আপনি কি জানেন: এটি ইতিমধ্যেই File.open মতো মূল লাইব্রেরিতে উপলব্ধ। তবে এটি এমন একটি সাধারণ প্যাটার্ন যা আপনি নিজের কোডেও ব্যবহার করতে পারেন, কোনও সংস্থান ক্লিনআপ (C # এ using ) বা লেনদেনগুলি বা আপনি যা ভাবতে পারেন তা প্রয়োগ করার জন্য।

একমাত্র ক্ষেত্রে যেখানে এটি কাজ করে না, যদি সংস্থান অর্জন এবং মুক্তি দেওয়া হয় তবে প্রোগ্রামের বিভিন্ন অংশে বিতরণ করা হয়। কিন্তু যদি এটি আপনার উদাহরণ হিসাবে স্থানীয়করণ হয়, তবে আপনি সহজেই এই সংস্থান ব্লকগুলি ব্যবহার করতে পারেন।

বিটিডব্লিউ: আধুনিক সি # এ, আসলে using অসম্ভব, কারণ আপনি রুবি-স্টাইল সংস্থার ব্লকগুলি নিজেরাই বাস্তবায়ন করতে পারেন:

class File
{
    static T open<T>(string filename, string mode, Func<File, T> block)
    {
        var handle = new File(filename, mode);
        try
        {
            return block(handle);
        }
        finally
        {
            handle.Dispose();
        }
    }
}

// Usage:

File.open("myFile.txt", "w", (file) =>
{
    file.WriteLine(contents);
});






error-handling