Erlang এ Error এবং Exception Handling: try, catch, throw
Erlang একটি শক্তিশালী ভাষা যা fault tolerance (ত্রুটি সহিষ্ণুতা) নিশ্চিত করার জন্য ডিজাইন করা হয়েছে। এই ভাষার মধ্যে error এবং exception handling খুবই গুরুত্বপূর্ণ, কারণ Erlang এর উদ্দেশ্য হলো সিস্টেমের ব্যর্থতা ঘটলেও অন্য অংশের কার্যকারিতা বজায় রাখা। try, catch, এবং throw ফাংশনগুলো ব্যবহার করে Erlang এ ত্রুটি হ্যান্ডলিং এবং এক্সেপশন হ্যান্ডলিং করা যায়।
1. try-catch ব্লক
Erlang এ try-catch স্টেটমেন্ট ব্যবহার করে কোডের যে কোনো অংশে ত্রুটি (exception) ধরা যায় এবং তাকে হ্যান্ডল করা যায়। এটি খুবই গুরুত্বপূর্ণ যখন আপনি এমন কোড লিখছেন যা অন্য কোন কারণে ব্যর্থ হতে পারে এবং আপনি সেই ব্যর্থতা কিভাবে মোকাবিলা করবেন তা নির্ধারণ করতে চান।
try-catch ব্লকের গঠন:
try
% কোড যা এক্সেপশন সৃষ্টি করতে পারে
catch
% ধরানো এক্সেপশন
Class:Reason -> % এক্সেপশন হ্যান্ডলিং
end.এখানে:
- try: এই ব্লকে সেই কোড লিখুন যেটি আপনি এক্সেপশন থেকে রক্ষা করতে চান।
- catch: এখানে আপনি যে এক্সেপশন ধরতে চান এবং তার পরবর্তী কর্ম কী হবে তা উল্লেখ করবেন।
- Class: এক্সেপশনের টাইপ, যেমন
errorবাthrow। - Reason: এক্সেপশনের কারণ, যেমন কোনও প্রোগ্রাম ত্রুটি বা অন্যান্য কারণ।
উদাহরণ:
try
X = 1 / 0, % Divide by zero error
catch
error:Reason -> io:format("Caught an error: ~p~n", [Reason])
end.এখানে, 1 / 0 এর জন্য error:div-by-zero এক্সেপশন ঘটবে এবং সেটি catch ব্লকে ধরার মাধ্যমে আমরা একটি কাস্টম মেসেজ প্রদর্শন করব।
আউটপুট:
Caught an error: badarithএখানে, এক্সেপশন badarith বা div-by-zero এর কারণে আমরা সেই ত্রুটির কারণ পেয়ে গেছি।
2. throw এবং try-catch এর মধ্যে সম্পর্ক
Erlang এ throw হল একটি কাস্টম এক্সেপশন যা আপনি ম্যানুয়ালি তৈরি করতে পারেন এবং এটি try-catch ব্লক দ্বারা ধরতে এবং হ্যান্ডল করা যায়।
উদাহরণ:
try
throw({custom_error, "Something went wrong!"})
catch
throw:{custom_error, Msg} -> io:format("Caught a custom error: ~s~n", [Msg])
end.এখানে, throw/1 দ্বারা কাস্টম এক্সেপশন তৈরি করা হয়েছে এবং catch ব্লকে সেই এক্সেপশনটি ধরা হয়েছে।
আউটপুট:
Caught a custom error: Something went wrong!এখানে, throw এর মাধ্যমে কাস্টম এক্সেপশন তৈরি করা হয়েছে এবং তা catch ব্লকের মাধ্যমে সঠিকভাবে হ্যান্ডল করা হয়েছে।
3. throw এর জন্য সাধারণ ব্যবহার
Erlang এ throw সাধারণত কোনও কোড ব্লক থেকে দ্রুত বেরিয়ে আসার জন্য ব্যবহার করা হয়, যেখানে কোনও নির্দিষ্ট অবস্থা বা ত্রুটি ঘটলে অবিলম্বে কার্যক্রম স্থগিত করা হয়।
উদাহরণ:
check_number(Number) ->
if
Number < 0 -> throw({negative_number, "Negative numbers are not allowed"});
true -> io:format("Number is valid: ~p~n", [Number])
end.এখানে, throw/1 ব্যবহার করে আমরা যদি Number নেতিবাচক হয়, তাহলে একটি কাস্টম ত্রুটি তৈরি করব এবং সেটি try-catch ব্লকের মাধ্যমে হ্যান্ডল করতে পারব।
ব্যবহার:
1> check_number(-5).
** exception throw: {negative_number,"Negative numbers are not allowed"} in function check_number/1এখানে, throw এক্সেপশন তৈরি হয়েছে, যা পরে হ্যান্ডল করা যাবে।
4. Error Handling Without try-catch (Explicit Error Handling)
Erlang-এ আপনি explicit error handling (স্পষ্ট ত্রুটি হ্যান্ডলিং) এর মাধ্যমে যে কোনো অবস্থা বা ত্রুটি হ্যান্ডল করতে পারেন। যেমন, আপনি ফাংশনের মধ্যে error বা exit ব্যবহার করতে পারেন।
Example:
divide(X, 0) -> exit({error, "Cannot divide by zero"});
divide(X, Y) -> X / Y.এখানে, যদি Y শূন্য হয়, তাহলে exit/1 ফাংশন ব্যবহার করে ত্রুটি তৈরি হবে। তারপর, আপনি এই ত্রুটিটি try-catch ব্লকে ধরতে পারবেন।
ব্যবহার:
1> divide(10, 0).
** exception exit: {error,"Cannot divide by zero"} in function divide/2এখানে, exit এর মাধ্যমে তৈরি হওয়া ত্রুটি ধরা হয়েছে এবং একটি কাস্টম মেসেজ দেখানো হয়েছে।
5. try-catch and Fault Tolerance
Erlang এর fault tolerance ধারণার জন্য try-catch অত্যন্ত গুরুত্বপূর্ণ। যখন আপনি একটি সিস্টেমে distributed, concurrent, এবং stateful প্রসেসের জন্য কোড লেখেন, তখন আপনি নিশ্চিত করতে চান যে, সিস্টেমের একটি অংশে ত্রুটি ঘটলে পুরো সিস্টেম প্রভাবিত না হয়।
উদাহরণ:
handle_request(Request) ->
try
process_request(Request)
catch
error:Reason -> handle_error(Reason)
end.এখানে, process_request/1 ফাংশনে যদি ত্রুটি ঘটে, তাহলে তা catch ব্লকে ধরা হবে এবং handle_error/1 ফাংশন দ্বারা সঠিকভাবে মোকাবিলা করা হবে। এর ফলে সিস্টেমের বাকি অংশে ত্রুটি ছড়াবে না।
উপসংহার
Erlang এ error এবং exception handling হল সিস্টেমের নির্ভরযোগ্যতা এবং fault tolerance নিশ্চিত করার জন্য অপরিহার্য একটি বৈশিষ্ট্য। try, catch, এবং throw ফাংশনগুলো ব্যবহার করে আপনি কোডের মধ্যে ত্রুটি ঘটলে তা সঠিকভাবে ধরতে এবং হ্যান্ডল করতে পারেন। Erlang এর fault tolerance ধারণা মূলত এই try-catch মেকানিজমের মাধ্যমে সিস্টেমের স্থায়িত্ব বজায় রাখে, যা খুবই গুরুত্বপূর্ণ যখন আপনি একাধিক প্রসেস এবং ডিস্ট্রিবিউটেড সিস্টেম তৈরি করেন।
Read more