☰ Year plan · Communication Technology (Arabic)

حين يخطئ الإدخال

Week 9 · Unit 1, Lesson 5 Handling User Input Errors in Python · 3 lessons
3

أخطاء محددة وإعادة المحاولة بحلقة

ICT Prep 3 Term 1, Unit 1, Lesson 5: pp. 54–63
الهدفأعالج أخطاء مختلفة بكتل ⁦except⁩ منفصلة وأكرر السؤال حتى يصبح المدخل جيدًا.
كلمات جديدة
⁦ZeroDivisionError⁩ · الخطأ الذي يظهر عند القسمة على صفر⁦while True⁩ · حلقة تتكرر حتى تخرج منها ⁦break⁩⁦break⁩ · تخرج من الحلقة فورًا⁦Exception⁩ · الاسم العام للأخطاء العادية؛ ولا يوجد اسم ⁦Error⁩
الشرح

يمكن أن يكون لكتلة ⁦try⁩ الواحدة عدة كتل ⁦except⁩، لكل منها خطأ مختلف. يقسم البرنامج التالي ⁦10⁩ على عدد مكتوب. الكلمة تسبب ⁦ValueError⁩، والقيمة المكتوبة ⁦0⁩ تسبب ⁦ZeroDivisionError⁩. والرسالتان مختلفتان لأن الخطأين يحتاجان إلى نصيحتين مختلفتين. نضع الأسماء المحددة أولًا؛ والاسم العام هو ⁦Exception⁩ ولا يوجد اسم ⁦Error⁩. وللسؤال من جديد بعد مدخل خاطئ نضع ⁦try⁩ داخل ⁦while True⁩. فإذا كان المدخل جيدًا خرجت ⁦break⁩ من الحلقة، وإذا كان سيئًا عرضت كتلة ⁦except⁩ رسالة وبدأت الحلقة من جديد. والفكرة نفسها تعمل داخل الدوال (تذكّر الأسبوع الثامن).

Python
1try:
2    num = int(input("Divide 10 by: "))
3    print(10 / num)
4except ValueError:
5    print("Please type digits only.")
6except ZeroDivisionError:
7    print("You cannot divide by zero.")
Output
Divide 10 by: 0
You cannot divide by zero.
أمثلة محلولة
Python
1while True:
2    try:
3        num = int(input("Enter a number: "))
4        print("You entered:", num)
5        break
6    except ValueError:
7        print("Numbers only, try again.")
Output
Enter a number: abc
Numbers only, try again.
Enter a number: 
Numbers only, try again.
Enter a number: 6
You entered: 6
يكتب المستخدم ⁦abc⁩ ثم لا شيء ثم ⁦6⁩. يفشل أول مدخلين ويعرضان رسالة وتسأل الحلقة من جديد. وينجح الثالث وتخرج ⁦break⁩ من الحلقة.
Python
1def to_number(text):
2    try:
3        return int(text)
4    except ValueError:
5        return 0
6
7print(to_number("12"))
8print(to_number("abc"))
Output
12
0
معالجة الخطأ داخل دالة: ترجع ⁦to_number⁩ القيمة ⁦0⁩ حين لا يكون النص عددًا صحيحًا. وهنا تعني ⁦0⁩ أنه لا يوجد عدد صالح. وقد يسأل برنامج حقيقي من جديد بدلًا من ذلك.
Python
1print(int("10") / int("2"))
Output
5.0
احذر في القسمة. ⁦int("10") / int("2")⁩ تعرض ⁦5.0⁩ وليس ٥ لأن العلامة ⁦/⁩ تعطي دائمًا ناتجًا عشريًا (الأسبوع الثاني).
نشاط الفصل

خطط لبرنامج يسأل عن عدد الأقلام ويكرر السؤال حتى يكتب المستخدم عددًا صحيحًا ⁦1⁩ أو أكبر. ارسم الحلقة في مخطط تدفق، واكتب الرسالتين: واحدة للكلمة وواحدة للعدد ⁦0⁩ أو الأقل. اختبره بالقيم المكتوبة ⁦zero⁩ و⁦10⁩ و⁦3⁩.

تدرّب
1
ماذا يعرض البرنامج الأول للقيمة المكتوبة ⁦4⁩؟
2
أي خطأ يسببه ⁦10 / 0⁩؟
3
ماذا تفعل ⁦break⁩ في حلقة إعادة المحاولة؟
4
هل ⁦except Error⁩ سطر صحيح؟