المسارات
/
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(UserNotFound(user_id)) في حال عدم العثور على المستخدم، بدلًا من Err(KeyNotFound).
  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"

ملاحظة: بدلًا من عرض رسالة خطأ للمستخدم عندما يستخدم HTTP بدلًا من HTTPS، يمكن لخادم الويب الخاص بك إعادة توجيه متصفحه إلى HTTPS، ولن يلاحظ المستخدم الخطأ حتى. ولأن الأخطاء صديقة للآلة في Roc، سيكون تنفيذ ذلك سهلًا جدًا.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Roc Exercism

مستعد لبدء معالجة الأخطاء؟

سجّل في Exercism لتتعلّم وتتقن Roc عبر 126 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.