এলিক্সিরে সব এরর 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 ইমপ্লিমেন্ট করে এমন দুটি নতুন এরর তৈরি করবেন।
শূন্য দিয়ে একটি সংখ্যা ভাগ করলে অনির্ধারিত ফলাফল আসে, আর টিমের সিদ্ধান্ত হলো এই ফলাফল একটি এরর দিয়ে প্রকাশ করাই সবচেয়ে ভালো।
DivisionByZeroError মডিউলটি এমনভাবে ইমপ্লিমেন্ট করুন যাতে এর এরর মেসেজ হয়: "division by zero occurred"
raise DivisionByZeroError
# => ** (DivisionByZeroError) division by zero occurred
RPN ক্যালকুলেটরগুলো যোগ করার আগে সংখ্যাগুলোর হিসাব রাখতে একটি স্ট্যাক ব্যবহার করে। টিম এই স্ট্যাক-কে সংখ্যার একটি তালিকা (ইন্টিজার ও ফ্লোটিং-পয়েন্ট) দিয়ে প্রকাশ করে, যেমন: [3, 4.0]। প্রতিটি অপারেশনের নিজের হিসাব করতে স্ট্যাকে নির্দিষ্ট সংখ্যক সংখ্যা থাকা দরকার। স্ট্যাকে যথেষ্ট সংখ্যা না থাকলে তাকে স্ট্যাক আন্ডারফ্লো এরর বলা হয়। StackUnderflowError এক্সেপশনটি ইমপ্লিমেন্ট করুন, যা একটি ডিফল্ট মেসেজ এবং ঐচ্ছিক অতিরিক্ত কনটেক্সট দেয়
raise StackUnderflowError
# => ** (StackUnderflowError) stack underflow occurred
raise StackUnderflowError, "when dividing"
# => ** (StackUnderflowError) stack underflow occurred, context: when dividing
divide/1 ফাংশনটি ইমপ্লিমেন্ট করুন, যা একটি স্ট্যাক (দুটি সংখ্যার একটি তালিকা) নেয় এবং:
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
মনে রাখবেন, তালিকার ক্রমটি উল্টো!
Exercism-এ সাইন আপ করুন, Elixir ট্র্যাকের 58টি কনসেপ্ট168টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।