الحاسب الآلي · الصف الثالث الإعدادي · الترم الأول
معالجة أخطاء المدخلات للمستخدم في لغة Python
أنواع الأخطاء في البرامج (الصياغة والتشغيل والمنطق)، والتحقق من مدخلات المستخدم، واستخدام try وexcept لمعالجة الاستثناءات مثل ValueError وZeroDivisionError، وتكرار طلب الإدخال حتى يكون صحيحًا.
آخر تحديث: · كيف نراجع المحتوى
مقدمة
- الوحدة: الوحدة الأولى: الذكاء الاصطناعي ولغات البرمجة
- الدرس: الخامس
برنامج يطلب عمرك، فتكتب «خمسة عشر» بالحروف بدل الرقم ؛ فيتوقف البرنامج برسالة خطأ حمراء. المستخدم لا يلتزم دائمًا بما نتوقعه، والبرنامج الجيد يتوقع الخطأ ويتعامل معه بلطف بدل أن ينهار.
أهداف التعلم
- أن تميز بين أخطاء الصياغة وأخطاء التشغيل والأخطاء المنطقية.
- أن تستخدم
tryوexceptلمعالجة أخطاء التشغيل. - أن تتعامل مع أخطاء محددة مثل
ValueErrorوZeroDivisionError. - أن تكتب برنامجًا يكرر طلب الإدخال حتى يُدخل المستخدم قيمة صحيحة.
شرح الدرس
أنواع الأخطاء
| النوع | متى يظهر | مثال |
|---|---|---|
| خطأ الصياغة (Syntax Error) | قبل التشغيل، لمخالفة قواعد اللغة | نسيان النقطتين بعد if |
| خطأ التشغيل (Runtime Error / Exception) | أثناء التشغيل | تحويل النص "abc" إلى عدد |
| الخطأ المنطقي (Logic Error) | البرنامج يعمل لكن النتيجة خاطئة | كتابة + بدل * |
هذا الدرس يركز على أخطاء التشغيل الناتجة غالبًا عن مدخلات المستخدم، وتسمى الاستثناءات.
ماذا يحدث بلا معالجة؟
age = int(input("Enter your age: "))
إذا أدخل المستخدم abc يتوقف البرنامج بالخطأ ValueError لأن int() لا تستطيع تحويل هذا النص إلى عدد صحيح.
جملة try و except
try:
age = int(input("Enter your age: "))
print("Next year you will be", age + 1)
except ValueError:
print("Please enter a whole number.")
- يوضع الكود الذي قد يسبب خطأً داخل
try. - إذا حدث الخطأ ينتقل التنفيذ فورًا إلى
exceptبدل توقف البرنامج. - إذا لم يحدث خطأ تُتجاهل كتلة
except.
معالجة أكثر من نوع
try:
a = int(input("First number: "))
b = int(input("Second number: "))
print("Result:", a / b)
except ValueError:
print("Numbers only, please.")
except ZeroDivisionError:
print("You cannot divide by zero.")
ويمكن إضافة else تُنفذ عند عدم حدوث خطأ، وfinally تُنفذ في كل الأحوال.
التحقق من المدخلات وتكرار الطلب
نجمع try مع حلقة while لإعادة السؤال حتى يُدخل المستخدم قيمة صحيحة ومقبولة:
while True:
try:
grade = int(input("Enter grade (0-100): "))
if 0 <= grade <= 100:
break
print("Grade must be between 0 and 100.")
except ValueError:
print("That is not a number. Try again.")
print("Saved grade:", grade)
لاحظ نوعين من التحقق: تحقق النوع (هل هو عدد؟) بواسطة try، وتحقق المدى (هل هو بين و؟) بواسطة if.
دالة إدخال آمنة
يمكن وضع هذا المنطق في دالة لإعادة استخدامه:
def read_int(message, low, high):
while True:
try:
value = int(input(message))
if low <= value <= high:
return value
print("Out of range.")
except ValueError:
print("Invalid number.")
age = read_int("Age: ", 5, 20)
أمثلة وتطبيقات
موقف: آلة حاسبة لمتوسط ثلاث درجات تقبل الأرقام العشرية.
total = 0
count = 0
while count < 3:
try:
total += float(input("Grade: "))
count += 1
except ValueError:
print("Enter a valid number.")
print("Average:", total / 3)
ملاحظات مهمة
- حدد نوع الخطأ في
exceptقدر الإمكان؛except:وحدها تخفي أخطاء لا تتوقعها. tryلا تكتشف الأخطاء المنطقية؛ هذه تحتاج إلى اختبار البرنامج بقيم معروفة النتائج.- اكتب رسالة خطأ واضحة تخبر المستخدم بما يجب فعله.
تطبيق إضافي: إذا أدخل المستخدم 0 مقامًا للكسر، فالتحويل إلى عدد ينجح لكن القسمة تثير ZeroDivisionError. وإذا أدخل كلمة بدل العدد يحدث ValueError. لذلك يمكن لكل except عرض رسالة محددة تساعد المستخدم على التصحيح، بدل رسالة عامة لا توضّح المشكلة.
خطأ شائع: وضع البرنامج كله داخل كتلة try. الأفضل أن تشمل الكتلة العملية المتوقع فشلها فقط؛ فهذا يجعل سبب الخطأ أوضح ويمنع إخفاء أخطاء برمجية أخرى تحتاج إلى إصلاح.
المفاهيم الأساسية
- ثلاثة أنواع للأخطاء: صياغة وتشغيل ومنطق.
tryتحيط بالكود المحتمل الخطأ، وexceptتعالجه.ValueErrorعند تحويل نص غير صالح، وZeroDivisionErrorعند القسمة على صفر.while Trueمعbreakلتكرار الطلب حتى يصح الإدخال.
ملخص الدرس
البرامج تتعامل مع مستخدمين قد يدخلون قيمًا غير متوقعة، فنستخدم try وexcept لالتقاط أخطاء التشغيل ومعالجتها برسائل واضحة بدل توقف البرنامج، ونضيف شروط تحقق المدى، ونكرر الطلب في حلقة حتى نحصل على مدخلات صحيحة.
أسئلة للتدريب
- صنّف الخطأ: برنامج يحسب مساحة الدائرة بضرب نصف القطر في بدل تربيعه.
- ما الخطأ الذي يظهر عند تنفيذ
int("12a")؟ - اكتب برنامجًا يطلب عددين ويطبع ناتج قسمتهما مع معالجة القسمة على صفر.
- عدّل برنامج الدرجة ليقبل الدرجات من إلى فقط.
- ما الفرق بين تحقق النوع وتحقق المدى؟