ট্র্যাক
/
Elixir
Elixir
/
অনুশীলনী
/
স্ট্যাক আন্ডারফ্লো
স্ট্যাক আন্ডারফ্লো

স্ট্যাক আন্ডারফ্লো

লার্নিং অনুশীলনী

ভূমিকা

এক্সেপশন

এলিক্সিরে সব এরর Exception Behaviour ইমপ্লিমেন্ট করে। Access Behaviour-এর মতোই, Exception Behaviour এমন কিছু কলব্যাক ফাংশন নির্ধারণ করে যা একটি মডিউলকে অবশ্যই ইমপ্লিমেন্ট করতে হয়, বিহ্যাভিয়ারের সফটওয়্যার চুক্তিটি পূরণ করার জন্য। একবার একটি এরর ডিফাইন করা হলে তার নিচের বৈশিষ্ট্যগুলো থাকে:

  • মডিউলের নামটিই এররের নাম নির্ধারণ করে।
  • মডিউলটি একটি এরর-স্ট্রাক্ট ডিফাইন করে।
  • স্ট্রাক্টটিতে একটি :message ফিল্ড থাকবে।
  • কাঙ্ক্ষিত এররটি রেইজ করতে মডিউলটি raise/1 এবং raise/2 দিয়ে ব্যবহার করা যায়।

Exception Behaviour আরও দুটি কলব্যাক নির্দিষ্ট করে: message/1 এবং exception/1। এগুলো ইমপ্লিমেন্ট করা না হলে ডিফল্ট ইমপ্লিমেন্টেশন ব্যবহার করা হবে। raise দিয়ে কল করা হলে message/1 এরর-স্ট্রাক্টটিকে একটি পাঠযোগ্য মেসেজে রূপান্তর করে। raise/2 দিয়ে কল করা হলে exception/1 মেসেজে অতিরিক্ত কনটেক্সট যোগ করার সুযোগ দেয়

একটি এক্সেপশন ডিফাইন করা

একটি এরর মডিউল থেকে এক্সেপশন ডিফাইন করতে আমরা defexception ম্যাক্রো ব্যবহার করি:

# Defines a minimal error, with the name `MyError`
defmodule MyError do
  defexception message: "error"
end

# Defines an error with a customized exception/1 function
defmodule MyCustomizedError do
  defexception message: "custom error"

  @impl true
  def exception(value) do
    case value do
      [] ->
        %MyCustomizedError{}

      _ ->
        %MyCustomizedError{message: "Alert: " <> value}
    end
  end
end

এক্সেপশন ব্যবহার করা

ডিফাইন করা এররগুলো বিল্ট-ইন এররের মতোই raise/1 বা raise/2 দিয়ে ব্যবহার করা যায়।

  • raise/1 মডিউলের নাম দিয়ে নির্দিষ্ট একটি এরর রেইজ করে; আর যদি আর্গুমেন্টটি একটি স্ট্রিং হয়, তাহলে সেই স্ট্রিংটিকে মেসেজ হিসেবে নিয়ে একটি RuntimeError রেইজ করবে।
  • raise/2 মডিউলের নাম দিয়ে নির্দিষ্ট একটি এরর রেইজ করে এবং একটি অ্যাট্রিবিউটস আর্গুমেন্ট নেয়, যা দিয়ে উপযুক্ত মেসেজসহ এররটি পাওয়া যায়।

নির্দেশনা

Instruments of Texas-এ আপনার কাজ চালিয়ে যাওয়ার সময় RPN ক্যালকুলেটরের Elixir সংস্করণ নিয়ে কাজ এগিয়ে চলেছে। স্ট্যান্ডার্ড লাইব্রেরি যে জেনেরিক এররগুলো দেয়, তার চেয়ে বেশি নির্দিষ্ট এরর রেইজ করার সুবিধা আপনার টিম চায়। আপনি কিছু গবেষণা করছেন, তবে সিদ্ধান্ত নিয়েছেন যে Exception Behaviour ইমপ্লিমেন্ট করে এমন দুটি নতুন এরর তৈরি করবেন।

1. শূন্য দিয়ে ভাগের এরর

শূন্য দিয়ে একটি সংখ্যা ভাগ করলে অনির্ধারিত ফলাফল আসে, আর টিমের সিদ্ধান্ত হলো এই ফলাফল একটি এরর দিয়ে প্রকাশ করাই সবচেয়ে ভালো।

DivisionByZeroError মডিউলটি এমনভাবে ইমপ্লিমেন্ট করুন যাতে এর এরর মেসেজ হয়: "division by zero occurred"

raise DivisionByZeroError
# => ** (DivisionByZeroError) division by zero occurred

2. স্ট্যাক আন্ডারফ্লো ঘটলে এরর

RPN ক্যালকুলেটরগুলো যোগ করার আগে সংখ্যাগুলোর হিসাব রাখতে একটি স্ট্যাক ব্যবহার করে। টিম এই স্ট্যাক-কে সংখ্যার একটি তালিকা (ইন্টিজার ও ফ্লোটিং-পয়েন্ট) দিয়ে প্রকাশ করে, যেমন: [3, 4.0]। প্রতিটি অপারেশনের নিজের হিসাব করতে স্ট্যাকে নির্দিষ্ট সংখ্যক সংখ্যা থাকা দরকার। স্ট্যাকে যথেষ্ট সংখ্যা না থাকলে তাকে স্ট্যাক আন্ডারফ্লো এরর বলা হয়। StackUnderflowError এক্সেপশনটি ইমপ্লিমেন্ট করুন, যা একটি ডিফল্ট মেসেজ এবং ঐচ্ছিক অতিরিক্ত কনটেক্সট দেয়

raise StackUnderflowError
# => ** (StackUnderflowError) stack underflow occurred

raise StackUnderflowError, "when dividing"
# => ** (StackUnderflowError) stack underflow occurred, context: when dividing

3. একটি ভাগ করার ফাংশন লিখুন

divide/1 ফাংশনটি ইমপ্লিমেন্ট করুন, যা একটি স্ট্যাক (দুটি সংখ্যার একটি তালিকা) নেয় এবং:

  • স্ট্যাকে যথেষ্ট সংখ্যা না থাকলে স্ট্যাক আন্ডারফ্লো রেইজ করে
  • ভাজক 0 হলে শূন্য দিয়ে ভাগ রেইজ করে (মনে রাখবেন, সংখ্যার স্ট্যাকটি উল্টো ক্রমে রাখা থাকে)
  • কোনো এরর রেইজ না হলে ভাগটি সম্পন্ন করে
RPNCalculator.Exception.divide([])
# => ** (StackUnderflowError) stack underflow occurred, context: when dividing

RPNCalculator.Exception.divide([0, 100])
# => ** (DivisionByZeroError) division by zero occurred

RPNCalculator.Exception.divide([4, 16])
# => 4

মনে রাখবেন, তালিকার ক্রমটি উল্টো!

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

স্ট্যাক আন্ডারফ্লো শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Elixir ট্র্যাকের 58টি কনসেপ্ট168টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।