نفّذ أنواعًا مختلفة من معالجة الأخطاء وإدارة الموارد.
من النقاط المهمة في البرمجة كيفية التعامل مع الأخطاء وإغلاق الموارد حتى عند حدوث أخطاء.
يتطلب منك هذا التمرين التعامل مع أخطاء متنوعة. ولأن معالجة الأخطاء تختلف باختلاف لغة البرمجة، ستحتاج إلى الرجوع إلى اختبارات مسارك لتعرف بدقة ما هو مطلوب.
أنت تبني خادم ويب صغيرًا يستعلم من قاعدة بيانات مستخدمين أصغر منه. يبدو الأمر سهلًا، لكن في الواقع يمكن أن تسوء أمور كثيرة (وغالبًا ما يحدث ذلك):
"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(UserNotFound(user_id)) في حال عدم العثور على المستخدم، بدلًا من Err(KeyNotFound).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"ملاحظة: بدلًا من عرض رسالة خطأ للمستخدم عندما يستخدم HTTP بدلًا من HTTPS، يمكن لخادم الويب الخاص بك إعادة توجيه متصفحه إلى HTTPS، ولن يلاحظ المستخدم الخطأ حتى. ولأن الأخطاء صديقة للآلة في Roc، سيكون تنفيذ ذلك سهلًا جدًا.
سجّل في Exercism لتتعلّم وتتقن Roc عبر 126 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.