ট্র্যাক
/
Roc
Roc
/
অনুশীলনী
/
এরর হ্যান্ডলিং
এরর হ্যান্ডলিং

এরর হ্যান্ডলিং

মধ্যম

নির্দেশনা

বিভিন্ন ধরনের এরর হ্যান্ডলিং ও রিসোর্স ম্যানেজমেন্ট বাস্তবায়ন করুন।

প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ বিষয় হলো এরর ঘটে গেলেও কীভাবে সেগুলো হ্যান্ডল করতে হয় এবং রিসোর্স বন্ধ করতে হয়।

এই অনুশীলনীতে আপনাকে বিভিন্ন ধরনের এরর হ্যান্ডল করতে হবে। এরর হ্যান্ডলিং বেশ প্রোগ্রামিং ভাষা নির্ভর হওয়ায় ঠিক কী করতে হবে তা জানতে আপনাকে আপনার ট্র্যাকের টেস্টগুলো দেখতে হবে।

ইমপ্লিমেন্টেশন

আপনি একটি ছোট ওয়েব সার্ভার তৈরি করছেন, যা আরও ছোট একটি ব্যবহারকারী ডেটাবেসে কোয়েরি করে। শুনতে সহজ মনে হচ্ছে, কিন্তু বাস্তব জগতে অনেক কিছুই ভুল হতে পারে (আর প্রায়ই হয়):

  • সংযোগটি অনিরাপদ হতে পারে: URL অবশ্যই "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)) এর মতো।

ঠিক আছে, চলুন শুরু করি! আপনাকে যা করতে হবে:

  1. get_user ইমপ্লিমেন্ট করুন, যা users "ডেটাবেস" (আসলে এটি কেবল একটি Dict) থেকে চাওয়া ব্যবহারকারীটিকে রিটার্ন করবে। ব্যবহারকারী খুঁজে না পাওয়া গেলে ফাংশনটি যেন Err(KeyNotFound) এর বদলে Err(UserNotFound(user_id)) রিটার্ন করে, তা নিশ্চিত করুন।
  2. parse_user_id ইমপ্লিমেন্ট করুন, যা URL-এর পাথ (যেমন "/users/123") একটি ধনাত্মক ইন্টিজার ব্যবহারকারী আইডিতে (123) রূপান্তর করবে। এরর হলে Err(InvalidUserId(user_id_str)) রিটার্ন করুন।
  3. getPage ইমপ্লিমেন্ট করুন:
    • URL যদি "https://example.com/" হয়, তাহলে Ok("Home page") রিটার্ন করুন
    • URL যদি "https://example.com/users/" হয়, তাহলে Ok("Users page") রিটার্ন করুন
    • URL যদি "https://example.com/users/<user_id>" হয়, তাহলে ব্যবহারকারী আইডিটি পার্স করুন, সেই আইডির ব্যবহারকারীটি লোড করুন এবং Ok("<user name>'s page") রিটার্ন করুন
    • URL-এর প্রিফিক্স যদি "https://" না হয়, তাহলে Err(InsecureConnection(url)) রিটার্ন করুন
    • URL-এর ডোমেইন নাম যদি "example.com" না হয়, তাহলে Err(InvalidDomain(url)) রিটার্ন করুন
    • পাথ যদি / বা /users/ বা /users/<user id> না হয়, তাহলে Err(PageNotFound(path)) রিটার্ন করুন
    • ব্যবহারকারী আইডি যদি ধনাত্মক ইন্টিজার না হয়, তাহলে Err(InvalidUserId(user_id_str)) রিটার্ন করুন
    • ব্যবহারকারী যদি না থাকেন, তাহলে Err(UserNotFound(user_id)) রিটার্ন করুন
  4. 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-এ এররগুলো মেশিন-বান্ধব হওয়ায় এটি ইমপ্লিমেন্ট করা খুবই সহজ হবে।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Roc Exercism

এরর হ্যান্ডলিং শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Roc ট্র্যাকের 126টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।