কম্পিউটার টিউটোরিয়াল

রুবিতে যেকোনো অবজেক্টকে এক্সেপশন হিসেবে রেইজ করা: টেকনিকস ও বেস্ট প্র্যাকটিসেস

রুবির raise সিনট্যাক্স আপনাকে কয়েকটি অপশন দেয় যে ধরনের এরর রেইজ করতে চান সেটি স্পেসিফাই করার জন্য। নিচের কোডে, আমি RuntimeError রেইজ করার তিনটি উপায় দেখিয়েছি।

raise "hello" raise RuntimeError, "hello" raise RuntimeError.new("hello") # ...উপরের সবগুলো ফলাফল "RuntimeError: hello" 

এটো ব 멀리, কিন্তু কী হবে যদি আমি এক্সেপশন ছাড়া অন্য কিছু রেইজ করতে চাই? কী হবে যদি আমি একটি নম্বর রেইজ করতে চাই? حسن, রুবি আমাকে দেয় না। আমি এমন একটি এরর মেসেজ পাবো:

raise 1 # TypeError: exception class/object expected 

এই মেসেজ আপনাকে বুঝাতে পারে যে raise এক্সেপশন ক্লাস/অবজেক্ট এক্সপেক্ট করে প্যারামিটার হিসেবে। কিন্তু এটো ভুল!

exception মেথড পরিচিতি

যদি আপনি raise foo করেন, raise মেথড foo কে এক্সেপশন অবজেক্ট এক্সপেক্ট করে না। এটি এক্সপেক্ট করে যে যখনই এটি foo.exception কল করবে, তখনই এটিকে একটি এক্সেপশন অবজেক্ট মILE।

মনে রাখার বিষয় হলো আপনি raise-এ যেকোনো জিনিস পাস করতে পারেন, শুধু শর্তটি হলো সেটির একটি exception মেথড থাকতে হবে যা একটি এক্সেপশন রিটার্ন করে।

তাহলে, আপনি চাইলে রুবির নম্বর ক্লাসগুলো মンキ-প্যাচ করে আপনাকে একটি নম্বর রেইজ করতে দিতে পারেন। সেটি কেমন দেখাবে সেটা নিচে:

class Fixnum def exception RuntimeError.new("I'm number: #{ self }") end end raise 42 # ...ফলাফল raise_number.rb:7:in `<main>': I'm number: 42 (RuntimeError) 

এটি একটি নাট ট্রিক, কিন্তু কি এটি রিয়েল লাইফে কখনো ইউজফুল হতে পারে? আমি যা প্র্যাক্টিক্যাল অ্যাপ্লিকেশন দেখি সেটি হলো এক্সেপশন বিল্ড করার লজিককে এক্সেপশন রেইজ করার ডিসিশন लेनेवाले লজিক থেকে আলাদা করা। এটি অবশ্য একটি এজ কেস। কিন্তু চলুন দেখি সেটি কেমন দেখতে পারে।

একটি সম্ভাব্য প্র্যাক্টিক্যাল উদাহরণ

ধরা যাক আমি একটি লাইন ডেটা পড়তে চাই যেকোনো ধরনের IO থেকে। এটি নেটওয়ার্ক IO হতে পারে, এটি ফাইল হতে পারে। এটি রিয়েলি ম্যাটার করে না। আমি শুধু ডেটা পড়তে চাই এবং চেক করতে চাই এটি ভ্যালিড কিনা।

যদি আমি যা ডেটা পড়লাম সেটি ভ্যালিড না হয়, তবে আমি একটি এক্সেপশন রেইজ করতে চাই। কিন্তু এক্সেপশনটি ইনপুট অনুযায়ী টেইলরড হতে হবে। একটি নেটওয়ার্ক কানেকশনের জন্য আলাদা ডিবাগ ইনফো দরকার হবে একটি লোকাল ফাইলের তুলনায়। আমি প্রতিটি ইনপুট ক্লাসের জন্য কাস্টম exception মেথড প্রদান করে এটি করতে পারি। নিচে কিছু পসিডো-রুবি দেওয়া হলো সেটি কেমন দেখতে পারে।

# এই তিনটি ক্লাস তিন ধরনের IO রিপ্রেজেন্ট করে আলাদা এক্সেপশনসহ। class NetworkConnection ... def exception NetworkConnectionError.new(url: url, ...) end end class LocalFile ... def exception FileError.new(path: path, ...) end end class UnixPipe ... def exception PipeError.new(...) end end def read_all(*items) items.each do |item| if item.readline != "foo" # আমরা আইটেমটিকে রেইজ করি, যা উপযুক্ত এক্সেপশন ক্লাস ব্যবহার করে। raise item end end end read_all(NetworkConnection.new(url: "example.com"), LocalFile.new("/something"), UnixPipe.new) 

  1. রুবিতে এনভায়রনমেন্ট ভেরিয়েবল মাস্টার করুন: একটি প্র্যাকটিক্যাল গাইড

  2. রুবি ম্যাট্রিক্স বুঝতে: ডেফিনিশন, অ্যাপ্লিকেশন এবং কীভাবে তৈরি করবেন

  3. রুবি Enumerable মেথড মাস্টারিং: Any, All, None এবং One

  4. রুবি Struct ও OpenStruct: দক্ষ ভ্যালু অবজেক্টস