قراءة رسائل الأخطاء وتتبعها — أساسيات Python
قراءة رسائل الأخطاء وتتبعها
كل المبرمجين يخطئون يومياً. الفرق بين المبتدئ والمحترف ليس عدد الأخطاء، بل سرعة فهمها. رسالة الخطأ ليست عدواً؛ إنها تخبرك أين المشكلة وما نوعها.
تشريح رسالة الخطأ (Traceback)
Traceback (most recent call last):
File "main.py", line 5, in <module>
total = price + quantity
TypeError: unsupported operand type(s) for +: 'int' and 'str'اقرأها من الأسفل:
1. آخر سطر: نوع الخطأ (TypeError) وشرحه: لا يمكن جمع int مع str.
2. السطر الذي قبله: الكود الذي فشل.
3. line 5: رقم السطر في ملفك.
أشهر الأخطاء ومعناها
| الخطأ | السبب المعتاد |
|---|---|
| SyntaxError | صياغة خاطئة: قوس ناقص، : منسية، تنصيص غير مغلق |
| IndentationError | إزاحة خاطئة أو خلط Tab ومسافات |
| NameError | اسم غير معرّف: خطأ إملائي أو استخدام قبل التعريف |
| TypeError | عملية على نوع غير مناسب ("5" + 3) |
| ValueError | النوع صحيح لكن القيمة غير مناسبة (int("abc")) |
| IndexError | فهرس خارج حدود القائمة |
| KeyError | مفتاح غير موجود في القاموس |
| ZeroDivisionError | قسمة على صفر |
| AttributeError | دالة غير موجودة لهذا النوع (5.upper()) |
طريقة منهجية لإيجاد الخطأ
1. اقرأ الرسالة كاملة وحدد نوع الخطأ والسطر.
2. افحص القيم: ما قيمة المتغيرات عند هذا السطر؟ اطبعها:
price = "100" # قيمة جاءت من input فهي نص
print("DEBUG price =", price, type(price))3. صغّر المشكلة: جرّب السطر المشكوك فيه وحده بقيم بسيطة.
4. غيّر شيئاً واحداً في كل مرة ثم أعد التشغيل.
الأخطاء المنطقية
أخطر الأخطاء هي التي لا تظهر لها رسالة: البرنامج يعمل لكن الناتج خاطئ. مثل > بدل >=، أو حساب المتوسط بقسمة المجموع على عدد خاطئ. هنا لا يساعدك إلا اختبار البرنامج بقيم تعرف ناتجها مسبقاً، وطباعة القيم الوسيطة.
الأخطاء المتوقعة: try و except
عندما يعتمد الخطأ على المستخدم (إدخال نص بدل رقم) فهذا ليس خطأً في الكود؛ تعامل معه:
try:
age = int(input("العمر: "))
except ValueError:
print("أدخل رقماً")لا تستخدم try لإخفاء أخطاء الكود نفسه؛ أصلحها.
تمرين
الكود في المثال يحتوي على خطأين منطقيين في دالة average و grade. اقرأه، توقّع الناتج، ثم قارن بالناتج الحقيقي وأصلح الخطأين.
# كل سطر في هذه القائمة يسبب نوعاً مختلفاً من الأخطاء
examples = [
("TypeError", lambda: "5" + 3),
("ValueError", lambda: int("abc")),
("IndexError", lambda: [1, 2, 3][10]),
("KeyError", lambda: {"a": 1}["b"]),
("ZeroDivisionError", lambda: 10 / 0),
("AttributeError", lambda: (5).upper()),
]
for expected, action in examples:
try:
action()
except Exception as error:
print(f"{type(error).__name__}: {error}")
# خطآن منطقيان — البرنامج يعمل بلا رسالة خطأ لكن النتيجة خاطئة
def average(numbers):
total = 0
for n in numbers:
total += n
return total / (len(numbers) - 1) # خطأ منطقي: يجب القسمة على len(numbers)
def grade(score):
if score > 90: # خطأ منطقي: 90 نفسها يجب أن تكون ممتاز
return "ممتاز"
return "جيد"
scores = [90, 80, 70]
print("DEBUG scores =", scores)
print("المتوسط:", average(scores)) # يطبع 120.0 بدل 80.0
print("تقدير 90:", grade(90)) # يطبع جيد بدل ممتاز
اختبر فهمك