Haskell এ Exceptions হ্যান্ডেল করা এবং তাদের Throw করা
Haskell একটি purely functional language, যার মানে হলো, এটি পার্শ্বপ্রতিক্রিয়া (side effects), যেমন exceptions, হ্যান্ডল করতে সক্ষম হওয়া উচিত। Haskell এর exception handling সিস্টেম IO মোনাডের মাধ্যমে কাজ করে, যা পার্শ্বপ্রতিক্রিয়া পরিচালনা করতে সহায়ক। এই সিস্টেমটি throw এবং catch ফাংশন ব্যবহার করে exceptions ফেলে এবং সেগুলোকে হ্যান্ডল করে।
এখানে exception handling এর প্রক্রিয়া, exception throw করার পদ্ধতি এবং এর ব্যবহার সম্পর্কে বিস্তারিত আলোচনা করা হবে।
১. Exceptions Throw করা
Haskell এ exception throw করা সাধারণত throw বা throwIO ফাংশন ব্যবহার করে করা হয়, যা একটি exception তৈরি করে এবং এটি সেই মুহূর্তে হ্যান্ডেল হওয়ার জন্য IO অ্যাকশনে রিটার্ন করে।
throw ফাংশন
import Control.Exception
throwExample :: IO ()
throwExample = throw (SomeException "Something went wrong!")এখানে, throw ফাংশনটি একটি SomeException তৈরি করছে এবং IO Monad এর মধ্যে এটি throw করছে।
throwIO ফাংশন
throwIO ফাংশনটি IO অ্যাকশন থেকে exceptions তৈরি করার জন্য ব্যবহৃত হয় এবং এটি I/O পার্শ্বপ্রতিক্রিয়া সহ exceptions তৈরি করে।
import Control.Exception
throwIOExample :: IO ()
throwIOExample = throwIO (SomeException "An I/O error occurred!")throwIO মূলত throw এর I/O ব্যবহারের জন্য প্রস্তুত করা সংস্করণ।
২. Exceptions Catch করা
Haskell এ exceptions গুলি catch ফাংশন ব্যবহার করে হ্যান্ডল করা হয়। catch একটি IO action নেয় এবং এটি একটি exception ধরলে সেই exception এর জন্য একটি হ্যান্ডলার প্রয়োগ করে।
catch ফাংশন
import Control.Exception
handleException :: IO ()
handleException = catch throwExample handler
handler :: SomeException -> IO ()
handler ex = putStrLn ("Caught exception: " ++ show ex)এখানে:
throwExampleএকটি exception ফেলে।catchফাংশনটি এই exception ধরে এবংhandlerফাংশনটি exception হ্যান্ডল করে, যা exception এর বার্তা কনসোলে প্রিন্ট করবে।
ব্যবহার:
Prelude> handleException
Caught exception: SomeException "Something went wrong!"এখানে, catch ফাংশনটি exception ধরে এবং handler এ পাঠিয়ে দেয়, যা exception এর বার্তা কনসোলে আউটপুট করে।
৩. try ফাংশন
try ফাংশনটি catch এর মতো কাজ করে, কিন্তু এটি Either টাইপ রিটার্ন করে, যেখানে Left অংশে exception এবং Right অংশে সঠিক ফলাফল থাকে।
উদাহরণ:
import Control.Exception
tryExample :: IO (Either SomeException String)
tryExample = try throwExampleএখানে, try ফাংশনটি throwExample এর exception ধরে এবং এর ফলস্বরূপ একটি Either রিটার্ন করে:
- Left: যদি exception ঘটে।
- Right: যদি exception না ঘটে।
ব্যবহার:
Prelude> tryExample
Left (SomeException "Something went wrong!")এখানে, Left এ exception এর বার্তা থাকে। যদি কোনো exception না ঘটত, তবে Right এর মধ্যে ফলাফল থাকতো।
৪. finally এবং bracket
Haskell এ finally এবং bracket ফাংশন দুটি নিরাপদভাবে রিসোর্স ম্যানেজমেন্ট এবং পরবর্তী ক্লিন-আপ কার্যক্রম পরিচালনার জন্য ব্যবহৃত হয়। এগুলি একটি কাজ সম্পাদন করার আগে এবং পরে অবশ্যই ক্লিন-আপ কার্যক্রম সম্পাদন করতে সাহায্য করে।
finally উদাহরণ:
import Control.Exception
exampleWithFinally :: IO ()
exampleWithFinally = do
putStrLn "Start"
finally
(putStrLn "Doing work..." >> throwIO (SomeException "Work failed"))
(putStrLn "Cleaning up")এখানে, finally ফাংশনটি প্রথমে কাজ করবে, তারপরে Cleaning up মেসেজটি আউটপুট করবে, এমনকি exception ঘটলে।
ব্যবহার:
Start
Doing work...
Cleaning up
Prelude> এখানে, কাজটি throwIO দ্বারা ব্যাহত হয়েছে, কিন্তু finally ফাংশনটি Cleaning up আউটপুট করেছে।
bracket উদাহরণ:
import Control.Exception
exampleWithBracket :: IO ()
exampleWithBracket = bracket
(putStrLn "Acquire resource") -- Acquire resource
(putStrLn "Release resource") -- Release resource
(\_ -> putStrLn "Performing work") -- Workএখানে, bracket তিনটি অ্যাকশন সম্পাদন করে:
- Acquire resource: রিসোর্স অধিকার করা।
- Performing work: আসল কাজ করা।
- Release resource: রিসোর্স মুক্ত করা।
৫. Custom Exceptions
Haskell এ আপনি আপনার নিজস্ব exceptions তৈরি করতে পারেন। এর জন্য Exception টাইপ ক্লাসের একটি ইনস্ট্যান্স তৈরি করতে হবে এবং আপনার কাস্টম exception টাইপ ঘোষণা করতে হবে।
কাস্টম exception তৈরি:
import Control.Exception
data MyException = MyError String
deriving Show
instance Exception MyExceptionএখানে, MyException একটি কাস্টম exception টাইপ এবং আমরা Exception টাইপ ক্লাসে এর ইনস্ট্যান্স তৈরি করেছি।
কাস্টম exception throw এবং catch:
throwMyException :: IO ()
throwMyException = throw (MyError "This is a custom exception")
handleMyException :: IO ()
handleMyException = catch throwMyException handler
where handler (MyError msg) = putStrLn ("Caught custom exception: " ++ msg)ব্যবহৃত:
Prelude> handleMyException
Caught custom exception: This is a custom exceptionউপসংহার
Haskell এ Exceptions হ্যান্ডল করা এবং Throw করা একটি অত্যন্ত শক্তিশালী এবং সুরক্ষিত পদ্ধতি, যা IO Monad এর মাধ্যমে সম্ভব। throw এবং catch ফাংশনগুলি exceptions তৈরি এবং ধরতে সহায়ক, এবং try, finally, bracket এর মতো ফাংশনগুলি ত্রুটির হ্যান্ডলিং এবং রিসোর্স ম্যানেজমেন্টকে আরও কার্যকরী এবং নিরাপদ করে তোলে। Haskell এর exception handling সিস্টেম ফাংশনাল প্রোগ্রামিংয়ের মধ্যে পার্শ্বপ্রতিক্রিয়া নিয়ন্ত্রণ করতে অত্যন্ত সহায়ক।
Read more