Tr

Try/Rescue মধ্যে Elixir

১টি অনুশীলনী

Try/Rescue সম্পর্কে

try .. rescue দিয়ে একটি ব্লকের ভেতরে রেইজ হওয়া এরর ধরে সেটি মূল্যায়ন করা যায়।

উদাহরণস্বরূপ:

try do
  raise RuntimeError, "error"
rescue
  e in RuntimeError -> :error
end
  • লাইন ১, try দিয়ে ব্লকটি ডিক্লেয়ার করা হয়।
  • লাইন ২, যে ফাংশন কলটি এরর তৈরি করতে পারে সেটি এখানে বসানো হয়, এই ক্ষেত্রে আমরা raise/1 কল করছি।
  • লাইন ৪, rescue অংশে আমরা যে এররটি রেইজ হয়েছে তার মডিউল নামের উপর প্যাটার্ন ম্যাচ করি
    • -> এর বাম দিকে:
      • e এরর স্ট্রাক্টের সাথে ম্যাচ করা হয়।
      • in হলো একটি কিওয়ার্ড।
      • RuntimeError হলো যে মডিউলটি ম্যাচ করা হচ্ছে, তবে যেকোনো এরর মডিউলের সাথেও, অথবা _ দিয়ে সব এররের সাথে ম্যাচ করা যায়।
    • ডান দিকে:
      • এররটি মিলে গেলে যে নির্দেশাবলি চালানো হবে।

এরর স্ট্রাক্ট

এইভাবে আপনি যে এররগুলো রেসকিউ করেন, সেগুলো হলো স্ট্রাক্ট (কখনও কখনও এগুলোকে "এক্সেপশন"-ও বলা হয়)। ভিন্ন ভিন্ন এরর স্ট্রাক্টে থাকে ভিন্ন ভিন্ন কী (key)। স্ট্যান্ডার্ড লাইব্রেরিতে "exceptions" বিভাগে আপনি সব পূর্বনির্ধারিত এররের একটি তালিকা পাবেন।

# ArithmeticError caused by division by zero
%ArithmeticError{message: "bad argument in arithmetic expression"}

# Protocol.UndefinedError caused by passing `nil` to `Enum.count/1`
%Protocol.UndefinedError{description: "", protocol: Enumerable, value: nil}

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

Exceptions কনসেপ্টে বর্ণনা করা আছে কীভাবে কাস্টম এরর স্ট্রাক্ট ডিফাইন করতে হয়।

অ্যান্টি-প্যাটার্ন এড়িয়ে চলুন

  • লজিক্যাল ফ্লো নিয়ন্ত্রণ করতে এরর ব্যবহার করে এমন প্রোগ্রামিং প্যাটার্ন এড়িয়ে চলুন। Elixir-এ এটি একটি অ্যান্টি-প্যাটার্ন।

    # Avoid using errors for control-flow.
    try do
      {:ok, value} = MyModule.janky_function()
      "All good! #{value}."
    rescue
      e in RuntimeError ->
        reason = e.message
        "Uh oh! #{reason}."
    end
    
    # Rather, use control-flow structures for control-flow.
    case MyModule.janky_function() do
      {:ok, value} -> "All good! #{value}."
      {:error, reason} -> "Uh oh! #{reason}."
    end
    

রেইজ করা, না করা, এই তো প্রশ্ন

Elixir-এর গেটিং স্টার্টেড গাইডে যেমন লেখা আছে:

[কোনো একটি কাজ করার সময়] কোনো এরর ব্যতিক্রমী কি না, তা ঠিক করা আপনার অ্যাপ্লিকেশনেরই কাজ। সেজন্যই Elixir [...] ফাংশনের উপর এক্সেপশন চাপিয়ে দেয় না। বরং কোন পথে এগোনো সবচেয়ে ভালো, সেটা বেছে নেওয়ার দায়িত্ব ডেভেলপারের হাতেই ছেড়ে দেয়।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

Try/Rescue শিখুন