Elixir এর Error এবং Exception Handling
Elixir একটি functional programming language এবং actor model ব্যবহার করে, যেখানে ত্রুটি (errors) এবং এক্সসেপশন (exceptions) পরিচালনা করার একটি গুরুত্বপূর্ণ দৃষ্টিকোণ রয়েছে। Elixir তে ত্রুটি ও এক্সসেপশন সঠিকভাবে পরিচালনা করার জন্য বিভিন্ন কৌশল এবং টুলস ব্যবহার করা হয়। Elixir তে ত্রুটি মোকাবেলা সাধারণত "let it crash" কৌশল অনুসরণ করে, যেখানে প্রক্রিয়া ব্যর্থ হলে সেটি পুনরায় চালু করা হয়। তবে, Elixir তে ত্রুটি এবং এক্সসেপশন হ্যান্ডলিংয়ের জন্য কিছু বিশেষ ফিচার এবং পদ্ধতি রয়েছে যা নিরাপদ এবং স্থিতিস্থাপক (fault-tolerant) সিস্টেম তৈরি করতে সহায়ক।
1. Elixir তে Error এবং Exception এর মধ্যে পার্থক্য
- Error: ত্রুটি সাধারণত সিস্টেমের ভুল, প্রোগ্রামের লজিক্যাল ত্রুটি বা অব্যবহৃত রিসোর্সের জন্য ঘটে। Elixir তে errors সাধারণত বড় প্রক্রিয়ায় ঘটে এবং এগুলিকে let it crash কৌশল দ্বারা পরিচালিত করা হয়।
- Exception: এক্সসেপশন সাধারণত একটি পূর্বনির্ধারিত পরিস্থিতি, যেখানে আপনি কাস্টম ত্রুটি তৈরি করতে পারেন এবং সেগুলি নির্দিষ্ট ভাবে হ্যান্ডেল করতে পারেন। এক্সসেপশনগুলি try/except ব্লক দ্বারা হ্যান্ডেল করা হয়।
2. Elixir Error Handling: Let It Crash Philosophy
Elixir তে "let it crash" কৌশল অত্যন্ত গুরুত্বপূর্ণ। এর মানে হল যে, যখন একটি প্রক্রিয়া (process) ত্রুটির সম্মুখীন হয়, তখন সেই প্রক্রিয়াটি ব্যর্থ হয়ে যায় এবং পুনরায় পুনরুদ্ধার করা হয়। Elixir তে, ত্রুটি সাধারণত একটি প্রক্রিয়ার মধ্যে ঘটে এবং যখন ত্রুটি হয়, তখন প্রক্রিয়াটি থেমে যায়, কিন্তু অন্য প্রক্রিয়াগুলি তার কার্যক্রম চালিয়ে যায়। Supervision tree ব্যবহারের মাধ্যমে এই সমস্যাটি মোকাবেলা করা হয়।
Let it Crash এর সুবিধা:
- সিস্টেমটি সহজ এবং কমপ্লেক্স থেকে মুক্ত থাকে।
- কোনো প্রক্রিয়া ব্যর্থ হলে, শুধু ঐ প্রক্রিয়াটি পুনরুদ্ধার করা হয়, সিস্টেমের অন্য প্রক্রিয়া অব্যাহত থাকে।
- এটি প্রক্রিয়াগুলির মধ্যে fault isolation নিশ্চিত করে।
3. Elixir Exception Handling: try/except
Elixir তে try/except ব্লক ব্যবহার করে আপনি কাস্টম এক্সসেপশন হ্যান্ডলিং করতে পারেন। এটি আপনাকে ত্রুটি ধরা এবং সেগুলি হ্যান্ডেল করার ক্ষমতা দেয়।
try/except এর সিনট্যাক্স:
try do
# risky code
rescue
exception ->
# exception handling code
end- try ব্লকের মধ্যে আপনি সেই কোড রাখেন যা ত্রুটি তৈরি করতে পারে।
- rescue ব্লকের মধ্যে আপনি সেই ত্রুটির জন্য হ্যান্ডলার প্রদান করেন।
উদাহরণ: একটি ডিভাইড (divide) ফাংশন তৈরি করা যা শূন্য দিয়ে ভাগ করার সময় এক্সসেপশন হ্যান্ডলিং করবে:
defmodule Math do
def divide(a, 0) do
raise "Cannot divide by zero"
end
def divide(a, b) do
a / b
end
end
try do
Math.divide(10, 0)
rescue
exception -> IO.puts("Error: #{exception.message}")
endএখানে, যদি Math.divide(10, 0) কল করা হয়, তাহলে এটি "Cannot divide by zero" এক্সসেপশন তৈরি করবে এবং rescue ব্লক সেটি হ্যান্ডেল করবে।
Rescue কাস্টম এক্সসেপশন:
Elixir তে আপনি raise কিওয়ার্ড ব্যবহার করে কাস্টম এক্সসেপশন তৈরি করতে পারেন। এটি এক্সসেপশন ঘটানোর জন্য ব্যবহৃত হয়।
defmodule MyError do
defexception message: "An error occurred"
end
defmodule Example do
def test do
raise MyError, message: "This is a custom error"
end
end
try do
Example.test()
rescue
e in MyError -> IO.puts("Caught error: #{e.message}")
endএখানে, MyError নামে একটি কাস্টম এক্সসেপশন তৈরি করা হয়েছে এবং Example.test কল করার সময় সেই এক্সসেপশনটি ঘটবে, যা rescue ব্লকে হ্যান্ডেল করা হবে।
4. Error Handling with try/catch
Elixir তে আপনি try/catch ব্লক ব্যবহার করে runtime errors (একমাত্র কিছু নির্দিষ্ট type এর এক্সসেপশন) হ্যান্ডেল করতে পারেন। তবে, এটি সাধারণত Elixir এর ত্রুটি হ্যান্ডলিং পদ্ধতির সাথে তুলনামূলকভাবে কম ব্যবহৃত হয়, কারণ এটি সাধারণত performance এর উপর প্রভাব ফেলে।
try/catch এর সিনট্যাক্স:
try do
# risky code
catch
type, reason ->
# handle the exception type and reason
end- catch ব্লক এ আপনি সিস্টেমের error type এবং কারণে reason এর মাধ্যমে exception হ্যান্ডেল করতে পারেন।
উদাহরণ:
try do
:erlang.error(:badarg) # raise a system error
catch
:error, reason -> IO.puts("Caught error: #{reason}")
endএখানে, :erlang.error(:badarg) ব্যবহার করা হয়েছে, যা একটি system error তৈরি করবে এবং catch ব্লক সেটি হ্যান্ডেল করবে।
5. Handling Multiple Errors
Elixir তে একাধিক এক্সসেপশন একসাথে হ্যান্ডেল করার জন্য try/catch বা try/rescue ব্লকগুলির মধ্যে একাধিক rescue স্টেটমেন্ট ব্যবহার করা যেতে পারে। এক্সসেপশন এবং ত্রুটির ধরন নির্দিষ্ট করে দেওয়া হয়।
Multiple Error Handling Example:
try do
# code that might raise different errors
raise ArgumentError, message: "Argument error occurred"
rescue
e in ArgumentError -> IO.puts("Caught ArgumentError: #{e.message}")
e in RuntimeError -> IO.puts("Caught RuntimeError: #{e.message}")
endএখানে, দুইটি ধরনের এক্সসেপশন (ArgumentError এবং RuntimeError) আলাদা আলাদা ভাবে হ্যান্ডেল করা হচ্ছে।
সারসংক্ষেপ
Elixir তে Error এবং Exception Handling একটি গুরুত্বপূর্ণ ভূমিকা পালন করে সিস্টেমের ত্রুটি মোকাবেলা এবং স্থিতিস্থাপকতা নিশ্চিত করার জন্য। Elixir তে ত্রুটি মোকাবেলার জন্য সাধারণত "let it crash" কৌশল অনুসরণ করা হয়, যেখানে ত্রুটি ঘটলে একটি প্রক্রিয়া ব্যর্থ হয়ে পুনরায় চালু হয়। তবে, যদি এক্সসেপশন হ্যান্ডলিং প্রয়োজন হয়, তাহলে try/except বা try/catch ব্লক ব্যবহার করা হয়। এগুলো ব্যবহার করে আপনি কোডের ত্রুটি পরিচালনা করতে পারেন, কাস্টম এক্সসেপশন তৈরি করতে পারেন এবং বিভিন্ন ধরনের ত্রুটির জন্য সঠিক প্রতিক্রিয়া জানাতে পারেন।
Read more