من أكثر الأشياء التي تخيف المبتدئ عند تعلم Python ظهور رسالة خطأ طويلة في الشاشة. قد ترى كلمات إنجليزية كثيرة، وأسطرًا متداخلة، وأسماء ملفات، وأرقام أسطر، ثم تشعر أن البرنامج كله تعطل ولا تعرف من أين تبدأ.
لكن الحقيقة أن رسائل الأخطاء في Python ليست عدوك. هي أشبه بخريطة صغيرة تخبرك: أين وقع الخطأ؟ ما نوعه؟ وما السبب الأقرب له؟ عندما تتعلم قراءة رسالة الخطأ بهدوء، ستصبح عملية تصحيح الكود أسهل بكثير.
في هذا الدرس من كورس أساسيات بايثون على موقع بايثون العرب سنتعلم شرح أخطاء Python وطريقة قراءة رسائل الخطأ، خصوصًا ما يسمى Traceback. سنفهم أجزاء الرسالة، ونطبق على أشهر الأخطاء مثل SyntaxError و NameError و TypeError و ValueError و IndexError و KeyError.
{getToc} $title={محتوى المقال}
الفكرة ببساطة: لا تقرأ رسالة الخطأ من أولها فقط. غالبًا أهم شيء للمبتدئ يكون في آخر سطر: نوع الخطأ وسببه، ثم ارجع للأعلى لمعرفة اسم الملف ورقم السطر. {alertInfo}
لماذا تظهر الأخطاء في Python؟
تظهر الأخطاء لأن Python يحاول تنفيذ الكود، لكنه يجد شيئًا لا يستطيع فهمه أو تنفيذه. قد يكون السبب:
- كتابة أمر بطريقة غير صحيحة.
- نسيان قوس أو علامة تنصيص.
- استخدام متغير قبل تعريفه.
- محاولة جمع نص مع رقم.
- تحويل نص غير رقمي إلى رقم.
- الوصول إلى عنصر غير موجود داخل List.
- فتح ملف غير موجود.
- استخدام مكتبة غير مثبتة.
الأخطاء جزء طبيعي من البرمجة. كل مبرمج، حتى المحترف، يرى أخطاء يوميًا. الفرق أن المحترف تعلم كيف يقرأها بدل أن يخاف منها.
ما معنى Traceback في Python؟
كلمة Traceback تعني تقريبًا "تتبع الرجوع" أو "تتبع مسار الخطأ". عندما يحدث خطأ، يعرض Python مسار التنفيذ الذي أدى إلى المشكلة، ثم يوضح لك السطر الذي وقع فيه الخطأ ونوع الخطأ في النهاية.
مثال بسيط:
age = int("abc")
print(age)
قد تظهر رسالة مثل:
Traceback (most recent call last):
File "main.py", line 1, in <module>
age = int("abc")
ValueError: invalid literal for int() with base 10: 'abc'
هذه الرسالة تبدو طويلة في البداية، لكنها تحتوي على معلومات واضحة جدًا.
أجزاء رسالة الخطأ في Python
لنقسم رسالة الخطأ السابقة:
Traceback (most recent call last):
File "main.py", line 1, in <module>
age = int("abc")
ValueError: invalid literal for int() with base 10: 'abc'
| الجزء | معناه |
|---|---|
Traceback |
بداية تقرير الخطأ ومسار حدوثه |
File "main.py" |
اسم الملف الذي حدث فيه الخطأ |
line 1 |
رقم السطر الذي يشير إليه Python |
age = int("abc") |
السطر الذي سبب المشكلة أو كان قريبًا منها |
ValueError |
نوع الخطأ |
invalid literal... |
شرح مختصر لسبب الخطأ |
كيف تقرأ رسالة الخطأ بطريقة صحيحة؟
عندما ترى رسالة خطأ، لا تبدأ بالذعر ولا تغير الكود عشوائيًا. اتبع هذه الخطوات:
- اقرأ آخر سطر أولًا.
- حدد نوع الخطأ مثل
ValueErrorأوNameError. - اقرأ سبب الخطأ المكتوب بعد النقطتين.
- ارجع للأعلى لمعرفة اسم الملف ورقم السطر.
- افتح السطر المذكور في محرر الكود.
- افحص السطر نفسه والسطر الذي قبله أحيانًا.
- جرّب إصلاحًا صغيرًا ثم شغل البرنامج مرة أخرى.
هذه الطريقة ستوفر عليك وقتًا كبيرًا.
قاعدة ذهبية: آخر سطر في رسالة الخطأ غالبًا يخبرك بنوع المشكلة، أما السطر الذي يحتوي على line فيخبرك أين تبحث. {alertSuccess}
مثال عملي: قراءة Traceback خطوة بخطوة
لنفترض أن لدينا هذا الكود:
numbers = [10, 20, 30]
print(numbers[5])
ستظهر رسالة تشبه:
Traceback (most recent call last):
File "main.py", line 3, in <module>
print(numbers[5])
IndexError: list index out of range
كيف نقرأها؟
- نوع الخطأ:
IndexError. - السبب:
list index out of rangeيعني أنك طلبت فهرسًا غير موجود في القائمة. - مكان الخطأ: الملف
main.pyفي السطر 3. - السطر المشكلة:
print(numbers[5]).
القائمة تحتوي على 3 عناصر فقط، وفهارسها هي 0 و 1 و 2. لذلك الفهرس 5 غير موجود.
التصحيح:
numbers = [10, 20, 30]
print(numbers[2])
الفرق بين الخطأ النحوي والخطأ أثناء التشغيل
في Python توجد أخطاء تظهر قبل تشغيل البرنامج فعليًا، وأخطاء تظهر أثناء التشغيل.
1. أخطاء نحوية Syntax Errors
هذه تحدث عندما يكتب المبرمج كودًا لا يستطيع Python فهمه من الأساس.
مثال:
if age >= 18
print("بالغ")
الخطأ هنا هو نسيان النقطتين : بعد شرط if.
قد تظهر رسالة:
SyntaxError: expected ':'
2. أخطاء أثناء التشغيل Runtime Errors
هذه تحدث عندما يكون شكل الكود صحيحًا، لكن المشكلة تظهر أثناء تنفيذ البرنامج.
مثال:
number = 10 / 0
الكود مفهوم من ناحية الصياغة، لكنه غير قابل للتنفيذ لأن القسمة على صفر ممنوعة.
ZeroDivisionError: division by zero
| النوع | متى يظهر؟ | مثال |
|---|---|---|
| خطأ نحوي | قبل تنفيذ البرنامج أو في بداية التشغيل | نسيان : أو قوس أو علامة تنصيص |
| خطأ أثناء التشغيل | أثناء تنفيذ الكود | قسمة على صفر أو فهرس غير موجود |
أشهر أخطاء Python للمبتدئين
لنمر الآن على أشهر الأخطاء التي ستقابلها في بداية تعلم Python، مع مثال وسبب وحل مختصر.
1. خطأ SyntaxError
يظهر SyntaxError عندما تكتب كودًا مخالفًا لقواعد لغة Python.
مثال خاطئ:
if 5 > 3
print("صحيح")
السبب: نسيان النقطتين :.
الصحيح:
if 5 > 3:
print("صحيح")
2. خطأ NameError
يظهر NameError عندما تستخدم اسم متغير أو دالة غير معرّفة.
مثال خاطئ:
print(username)
إذا لم تكن قد عرّفت username قبلها، سيظهر الخطأ.
الصحيح:
username = "Ali"
print(username)
3. خطأ TypeError
يظهر TypeError عندما تستخدم نوع بيانات بطريقة غير مناسبة.
مثال خاطئ:
age = 20
print("عمري " + age)
لا يمكن جمع نص مع رقم مباشرة باستخدام +.
الصحيح:
age = 20
print("عمري " + str(age))
أو بطريقة أفضل:
age = 20
print(f"عمري {age}")
4. خطأ ValueError
يظهر ValueError عندما يكون نوع البيانات مناسبًا، لكن القيمة نفسها غير مناسبة.
مثال خاطئ:
number = int("abc")
هنا int() يمكنها تحويل النصوص الرقمية مثل "123"، لكنها لا تستطيع تحويل "abc".
الصحيح:
number = int("123")
5. خطأ IndexError
يظهر IndexError عندما تحاول الوصول إلى عنصر غير موجود داخل قائمة.
مثال خاطئ:
names = ["Ali", "Sara"]
print(names[5])
القائمة تحتوي على عنصرين فقط، لذلك الفهرس 5 غير موجود.
الصحيح:
names = ["Ali", "Sara"]
print(names[0])
6. خطأ KeyError
يظهر KeyError عندما تحاول الوصول إلى مفتاح غير موجود داخل Dictionary.
مثال خاطئ:
student = {
"name": "Ali",
"age": 20
}
print(student["grade"])
المفتاح grade غير موجود.
حل آمن باستخدام get():
student = {
"name": "Ali",
"age": 20
}
print(student.get("grade", "لا توجد درجة"))
7. خطأ FileNotFoundError
يظهر FileNotFoundError عندما يحاول Python فتح ملف غير موجود أو مساره غير صحيح.
مثال:
with open("data.txt", "r", encoding="utf-8") as file:
content = file.read()
إذا كان الملف غير موجود، سيظهر الخطأ.
الحل: تأكد من اسم الملف ومكانه، أو افحص وجوده قبل فتحه.
8. خطأ ModuleNotFoundError
يظهر ModuleNotFoundError عندما تحاول استيراد مكتبة غير مثبتة أو كتبت اسمها بشكل غير صحيح.
مثال:
import requests
إذا لم تكن مكتبة requests مثبتة، قد يظهر الخطأ.
الحل غالبًا:
pip install requests
جدول سريع لأشهر الأخطاء ومعناها
| نوع الخطأ | معناه المختصر | مثال السبب |
|---|---|---|
SyntaxError |
خطأ في صياغة الكود | نسيان : أو قوس |
NameError |
اسم غير معروف | استخدام متغير قبل تعريفه |
TypeError |
استخدام نوع بيانات بطريقة خاطئة | جمع نص مع رقم |
ValueError |
قيمة غير مناسبة | تحويل "abc" إلى رقم |
IndexError |
فهرس غير موجود | طلب عنصر خارج حدود List |
KeyError |
مفتاح غير موجود | طلب مفتاح غير موجود في Dictionary |
FileNotFoundError |
ملف غير موجود | اسم الملف أو المسار خطأ |
ModuleNotFoundError |
مكتبة غير موجودة | المكتبة غير مثبتة أو الاسم خطأ |
كيف تستخدم رقم السطر في تصحيح الخطأ؟
عندما يقول Python:
File "main.py", line 12
فهذا يعني أن عليك فتح الملف main.py والذهاب إلى السطر رقم 12. لكن انتبه: أحيانًا يكون الخطأ الحقيقي في السطر السابق.
مثال:
message = "Hello
print(message)
قد يشير Python إلى السطر الثاني، لكن السبب الحقيقي هو أن علامة التنصيص لم تغلق في السطر الأول.
تنبيه مهم: إذا لم تفهم الخطأ في السطر المذكور، افحص السطر الذي قبله. كثير من أخطاء الأقواس والتنصيص تبدأ قبل السطر الذي يشير إليه Python. {alertWarning}
كيف تقرأ الأخطاء في المشاريع متعددة الملفات؟
في المشاريع الأكبر، قد ترى Traceback يحتوي على أكثر من ملف وأكثر من سطر. مثال مبسط:
Traceback (most recent call last):
File "main.py", line 10, in <module>
run_app()
File "helpers.py", line 5, in run_app
age = int("abc")
ValueError: invalid literal for int() with base 10: 'abc'
هنا لديك أكثر من سطر:
main.pyاستدعى الدالةrun_app().- الدالة موجودة في
helpers.py. - الخطأ الحقيقي حدث في
helpers.pyفي السطر 5. - نوع الخطأ
ValueError.
في هذه الحالة، ابدأ من آخر جزء في Traceback لأنه غالبًا الأقرب لمكان الخطأ الحقيقي.
استخدام print لفهم مكان المشكلة
من أبسط طرق التصحيح للمبتدئين استخدام print() لفهم القيم أثناء تنفيذ البرنامج.
مثال:
text = "25"
print("قبل التحويل:", text)
number = int(text)
print("بعد التحويل:", number)
هذا يساعدك على معرفة أين يتوقف البرنامج وما قيمة المتغير قبل حدوث الخطأ.
استخدام try و except للتعامل مع الأخطاء المتوقعة
ليست كل الأخطاء يجب أن توقف البرنامج. أحيانًا يكون الخطأ متوقعًا، مثل أن يدخل المستخدم نصًا بدل رقم. هنا نستخدم try و except.
try:
age = int(input("أدخل عمرك: "))
print("عمرك هو:", age)
except ValueError:
print("من فضلك أدخل رقمًا صحيحًا.")
بهذا لا يتوقف البرنامج فجأة، بل يعرض رسالة واضحة.
راجع درس شرح try و except في Python للمبتدئين لفهم هذه الفكرة بشكل أوسع.
أفضل خطوات حل أي خطأ في Python
- انسخ آخر سطر من رسالة الخطأ واقرأه جيدًا.
- حدد نوع الخطأ:
ValueError،TypeError،NameError، وهكذا. - اذهب إلى رقم السطر المذكور في الرسالة.
- افحص السطر والسطر الذي قبله.
- اسأل: ما نوع القيمة؟ ما اسم المتغير؟ هل الملف موجود؟ هل الفهرس صحيح؟
- جرّب إصلاحًا صغيرًا واحدًا فقط.
- شغل البرنامج مرة أخرى.
- إذا ظهر خطأ جديد، اقرأه بنفس الطريقة.
أخطاء شائعة عند التعامل مع رسائل الخطأ
1. قراءة أول سطر فقط
أول سطر يقول غالبًا Traceback، وليس هو الأهم. آخر سطر يحتوي عادة على نوع الخطأ وسببه.
2. تجاهل رقم السطر
رقم السطر يوفر عليك وقتًا كبيرًا. استخدمه للوصول إلى مكان المشكلة بدل البحث في كل الملف.
3. تعديل الكود عشوائيًا
لا تغير أكثر من شيء دفعة واحدة. عدّل سببًا محتملًا واحدًا، ثم جرب.
4. نسخ الحل من الإنترنت بدون فهم
قد يحل المشكلة مؤقتًا، لكنه لا يعلمك السبب. اقرأ نوع الخطأ وافهم لماذا حدث.
5. الخوف من الأخطاء
الأخطاء ليست علامة فشل. هي جزء من التعلم، وكل خطأ تفهمه يجعلك أقوى في البرمجة.
مثال تدريبي شامل
اقرأ الكود التالي وحاول توقع الخطأ:
prices = ["10", "20", "abc", "40"]
total = 0
for price in prices:
total += int(price)
print(total)
الخطأ المتوقع:
ValueError: invalid literal for int() with base 10: 'abc'
السبب أن القيمة "abc" ليست رقمًا، ولا يمكن تحويلها باستخدام int().
حل آمن للمثال التدريبي
يمكننا تجاهل القيم غير الرقمية أو التعامل معها برسالة:
prices = ["10", "20", "abc", "40"]
total = 0
for price in prices:
try:
total += int(price)
except ValueError:
print("تم تجاهل قيمة غير رقمية:", price)
print("المجموع:", total)
الناتج:
تم تجاهل قيمة غير رقمية: abc
المجموع: 70
تدريب عملي
لديك الكود التالي:
student = {
"name": "Sara",
"grade": 90
}
print(student["city"])
المطلوب:
- شغل الكود واقرأ رسالة الخطأ.
- حدد نوع الخطأ.
- حدد المفتاح الذي سبب المشكلة.
- اكتب حلًا باستخدام
get().
حل مختصر للتدريب
student = {
"name": "Sara",
"grade": 90
}
city = student.get("city", "غير محددة")
print(city)
روابط داخلية مفيدة من بايثون العرب
- كورس أساسيات بايثون للمبتدئين
- أساسيات بايثون 31: شرح try و except في Python
- سلسلة مشكلة وحل في بايثون
- حل خطأ ModuleNotFoundError و ImportError في Python
- حل خطأ FileNotFoundError في Python عند فتح الملفات
- حل خطأ JSONDecodeError في Python عند قراءة ملفات JSON
- حل خطأ PermissionError في Python عند فتح الملفات
مصادر خارجية مفيدة للتوسع
- توثيق Python الرسمي حول الأخطاء والاستثناءات
- قائمة الاستثناءات المدمجة في Python
- توثيق Python الرسمي لمكتبة traceback
الخلاصة
رسائل الأخطاء في Python ليست شيئًا يجب أن تخاف منه. هي أداة تساعدك على فهم المشكلة وتصحيح الكود. تعلّم قراءة آخر سطر لمعرفة نوع الخطأ، ثم ارجع إلى رقم السطر واسم الملف لتعرف مكان المشكلة.
في هذا الدرس تعلمنا معنى Traceback، وكيف نقرأ أجزاء رسالة الخطأ، وراجعنا أشهر أخطاء Python للمبتدئين مثل SyntaxError و NameError و TypeError و ValueError و IndexError و KeyError. ومع التدريب ستصبح قراءة الأخطاء مهارة طبيعية جدًا في رحلتك مع البرمجة.
الخلاصة العملية: اقرأ آخر سطر لتعرف نوع الخطأ، ثم استخدم رقم السطر لتصل إلى مكان المشكلة، ولا تعدل الكود عشوائيًا. كل خطأ تفهمه اليوم سيختصر عليك وقتًا كبيرًا غدًا. {alertSuccess}
أسئلة شائعة مع إجاباتها
ما معنى Traceback في Python؟
هو تقرير يعرضه Python عند حدوث خطأ، ويوضح مسار تنفيذ الكود واسم الملف ورقم السطر ونوع الخطأ.
ما أهم جزء في رسالة الخطأ؟
غالبًا آخر سطر هو الأهم، لأنه يحتوي على نوع الخطأ وشرح مختصر لسببه.
هل رقم السطر في الخطأ دقيق دائمًا؟
غالبًا يساعدك على الوصول للمكان الصحيح، لكن في بعض أخطاء الأقواس والتنصيص قد يكون السبب الحقيقي في السطر السابق.
ما الفرق بين SyntaxError و Runtime Error؟
SyntaxError يحدث عندما تكون صياغة الكود غير صحيحة، أما أخطاء التشغيل فتحدث أثناء تنفيذ كود صحيح من ناحية الشكل لكنه يسبب مشكلة أثناء التشغيل.
كيف أتعامل مع ValueError؟
افحص القيمة التي تحاول استخدامها. مثلًا إذا كنت تستخدم int()، تأكد أن النص يحتوي على رقم فعلاً.
هل أستخدم try و except مع كل خطأ؟
لا. استخدم try و except مع الأخطاء المتوقعة مثل إدخال المستخدم أو قراءة الملفات، لكن لا تستخدمها لإخفاء الأخطاء بدون فهم.



