বিভিন্ন ধরনের এরর হ্যান্ডলিং ও রিসোর্স ম্যানেজমেন্ট বাস্তবায়ন করুন।
প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ বিষয় হলো এরর ঘটে গেলেও কীভাবে সেগুলো হ্যান্ডল করতে হয় এবং রিসোর্স বন্ধ করতে হয়।
এই অনুশীলনীতে আপনাকে বিভিন্ন ধরনের এরর হ্যান্ডল করতে হবে। এরর হ্যান্ডলিং বেশ প্রোগ্রামিং ভাষা নির্ভর হওয়ায় ঠিক কী করতে হবে তা জানতে আপনাকে আপনার ট্র্যাকের টেস্টগুলো দেখতে হবে।
আপনি একটি ছোট ওয়েব সার্ভার তৈরি করছেন, যা আরও ছোট একটি ব্যবহারকারী ডেটাবেসে কোয়েরি করে। শুনতে সহজ মনে হচ্ছে, কিন্তু বাস্তব জগতে অনেক কিছুই ভুল হতে পারে (আর প্রায়ই হয়):
"https://" দিয়ে শুরু হতে হবে"example.com" হওয়া উচিত"https://example.com/", "https://example.com/users/" ও "https://example.com/users/<user_id>" অনুমোদিতuser_id ধনাত্মক ইন্টিজার নাও হতে পারেuser_id দিয়ে ডেটাবেসে কোনো ব্যবহারকারী নাও থাকতে পারেকিছু ভুল হলে শেষ ব্যবহারকারীকে একটি সুন্দর ও সহায়ক এরর মেসেজ দেওয়া জরুরি, যাতে তিনি সমস্যাটি সমাধান করতে পারেন। এর জন্য আপনাকে নিশ্চিত করতে হবে যে আপনার কোড তথ্যবহুল এররটি যেখানে ধরা পড়ে সেই জায়গা থেকে যেখানে এরর মেসেজ তৈরি হয় সেই জায়গা পর্যন্ত পৌঁছে দেয়।
ভাগ্যক্রমে, Roc আপনাকে আপনার Err ট্যাগের ভেতরে পেলোড (অর্থাৎ ডেটা) বহন করার সুযোগ দেয়। সরাসরি একটি এরর মেসেজ বহন করা লোভনীয় (যেমন Err("User #42 was not found")), আর কিছু সহজ ক্ষেত্রে এটি ঠিকই থাকতে পারে, তবে এর বেশ কিছু সীমাবদ্ধতা আছে:
Str.to_u64 ফাংশনটি নানা রকম ইন্টিজার পার্স করতে ব্যবহার করা যায়: দিন, সেকেন্ড, ব্যবহারকারী আইডি এবং আরও অনেক কিছু। এরর মেসেজটি যদি শুধু Could not convert string "0.5" to a positive integer বলে, তাহলে সমস্যাটি সমাধান করার মতো পর্যাপ্ত প্রসঙ্গ ব্যবহারকারীর কাছে নাও থাকতে পারে।তাই এই অনুশীলনীতে আপনার এররগুলো বরং অর্থবহ একটি ট্যাগ বহন করবে, সঙ্গে সেই ট্যাগের নিজস্ব সহায়ক পেলোড। উদাহরণস্বরূপ, ব্যবহারকারী খুঁজে না পাওয়া গেলে এররটি দেখতে হবে Err(UserNotFound(42)) এর মতো।
ঠিক আছে, চলুন শুরু করি! আপনাকে যা করতে হবে:
get_user ইমপ্লিমেন্ট করুন, যা users "ডেটাবেস" (আসলে এটি কেবল একটি Dict) থেকে চাওয়া ব্যবহারকারীটিকে রিটার্ন করবে। ব্যবহারকারী খুঁজে না পাওয়া গেলে ফাংশনটি যেন Err(KeyNotFound) এর বদলে Err(UserNotFound(user_id)) রিটার্ন করে, তা নিশ্চিত করুন।parse_user_id ইমপ্লিমেন্ট করুন, যা URL-এর পাথ (যেমন "/users/123") একটি ধনাত্মক ইন্টিজার ব্যবহারকারী আইডিতে (123) রূপান্তর করবে। এরর হলে Err(InvalidUserId(user_id_str)) রিটার্ন করুন।getPage ইমপ্লিমেন্ট করুন:
"https://example.com/" হয়, তাহলে Ok("Home page") রিটার্ন করুন"https://example.com/users/" হয়, তাহলে Ok("Users page") রিটার্ন করুন"https://example.com/users/<user_id>" হয়, তাহলে ব্যবহারকারী আইডিটি পার্স করুন, সেই আইডির ব্যবহারকারীটি লোড করুন এবং Ok("<user name>'s page") রিটার্ন করুন"https://" না হয়, তাহলে Err(InsecureConnection(url)) রিটার্ন করুন"example.com" না হয়, তাহলে Err(InvalidDomain(url)) রিটার্ন করুন/ বা /users/ বা /users/<user id> না হয়, তাহলে Err(PageNotFound(path)) রিটার্ন করুনErr(InvalidUserId(user_id_str)) রিটার্ন করুনErr(UserNotFound(user_id)) রিটার্ন করুনerror_essage ইমপ্লিমেন্ট করুন, যা আগের এররগুলোকে অনূদিত এরর মেসেজে রূপান্তর করবে। ফাংশনটি অন্তত ইংরেজি সামলাতে হবে, তবে আরও একটি ভাষা সামলানোর চেষ্টা করার জন্য আপনাকে উৎসাহিত করা হচ্ছে। ইংরেজি এরর মেসেজগুলো দেখতে এমন হওয়া উচিত:"Insecure connection (non HTTPS): http://example.com/users/789""Invalid domain name: https://google.com/wrong""Page not found: /oops""User ID is not a positive integer: abc""User #42 was not found"দ্রষ্টব্য: ব্যবহারকারী HTTPS-এর বদলে HTTP ব্যবহার করলে তাকে এরর মেসেজ দেখানোর বদলে আপনার ওয়েব সার্ভার তার ব্রাউজারকে HTTPS-এ রিডাইরেক্ট করতে পারে, আর ব্যবহারকারী এররটি টেরই পাবেন না। Roc-এ এররগুলো মেশিন-বান্ধব হওয়ায় এটি ইমপ্লিমেন্ট করা খুবই সহজ হবে।
Exercism-এ সাইন আপ করুন, Roc ট্র্যাকের 126টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।