أساسيات بايثون 32: شرح أخطاء Python وطريقة قراءة رسائل الخطأ للمبتدئين

شرح أخطاء Python وطريقة قراءة رسائل الخطأ Traceback للمبتدئين

من أكثر الأشياء التي تخيف المبتدئ عند تعلم 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... شرح مختصر لسبب الخطأ

شرح أجزاء رسالة الخطأ في Python مثل اسم الخطأ ورقم السطر والملف

كيف تقرأ رسالة الخطأ بطريقة صحيحة؟

عندما ترى رسالة خطأ، لا تبدأ بالذعر ولا تغير الكود عشوائيًا. اتبع هذه الخطوات:

  1. اقرأ آخر سطر أولًا.
  2. حدد نوع الخطأ مثل ValueError أو NameError.
  3. اقرأ سبب الخطأ المكتوب بعد النقطتين.
  4. ارجع للأعلى لمعرفة اسم الملف ورقم السطر.
  5. افتح السطر المذكور في محرر الكود.
  6. افحص السطر نفسه والسطر الذي قبله أحيانًا.
  7. جرّب إصلاحًا صغيرًا ثم شغل البرنامج مرة أخرى.

هذه الطريقة ستوفر عليك وقتًا كبيرًا.

قاعدة ذهبية: آخر سطر في رسالة الخطأ غالبًا يخبرك بنوع المشكلة، أما السطر الذي يحتوي على 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])

طريقة قراءة Traceback في Python خطوة بخطوة للوصول إلى سبب الخطأ

الفرق بين الخطأ النحوي والخطأ أثناء التشغيل

في Python توجد أخطاء تظهر قبل تشغيل البرنامج فعليًا، وأخطاء تظهر أثناء التشغيل.

1. أخطاء نحوية Syntax Errors

هذه تحدث عندما يكتب المبرمج كودًا لا يستطيع Python فهمه من الأساس.

مثال:

if age >= 18
    print("بالغ")

الخطأ هنا هو نسيان النقطتين : بعد شرط if.

قد تظهر رسالة:

SyntaxError: expected ':'

2. أخطاء أثناء التشغيل Runtime Errors

هذه تحدث عندما يكون شكل الكود صحيحًا، لكن المشكلة تظهر أثناء تنفيذ البرنامج.

مثال:

number = 10 / 0

الكود مفهوم من ناحية الصياغة، لكنه غير قابل للتنفيذ لأن القسمة على صفر ممنوعة.

ZeroDivisionError: division by zero
النوع متى يظهر؟ مثال
خطأ نحوي قبل تنفيذ البرنامج أو في بداية التشغيل نسيان : أو قوس أو علامة تنصيص
خطأ أثناء التشغيل أثناء تنفيذ الكود قسمة على صفر أو فهرس غير موجود

أشهر أخطاء Python للمبتدئين

لنمر الآن على أشهر الأخطاء التي ستقابلها في بداية تعلم Python، مع مثال وسبب وحل مختصر.


أمثلة على أشهر أخطاء Python مثل SyntaxError و NameError و TypeError و ValueError

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


أفضل ممارسات التعامل مع أخطاء Python وتصحيح الكود للمبتدئين
  1. انسخ آخر سطر من رسالة الخطأ واقرأه جيدًا.
  2. حدد نوع الخطأ: ValueError، TypeError، NameError، وهكذا.
  3. اذهب إلى رقم السطر المذكور في الرسالة.
  4. افحص السطر والسطر الذي قبله.
  5. اسأل: ما نوع القيمة؟ ما اسم المتغير؟ هل الملف موجود؟ هل الفهرس صحيح؟
  6. جرّب إصلاحًا صغيرًا واحدًا فقط.
  7. شغل البرنامج مرة أخرى.
  8. إذا ظهر خطأ جديد، اقرأه بنفس الطريقة.

أخطاء شائعة عند التعامل مع رسائل الخطأ

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"])

المطلوب:

  1. شغل الكود واقرأ رسالة الخطأ.
  2. حدد نوع الخطأ.
  3. حدد المفتاح الذي سبب المشكلة.
  4. اكتب حلًا باستخدام get().

حل مختصر للتدريب

student = {
    "name": "Sara",
    "grade": 90
}

city = student.get("city", "غير محددة")

print(city)

روابط داخلية مفيدة من بايثون العرب

مصادر خارجية مفيدة للتوسع

الخلاصة

رسائل الأخطاء في Python ليست شيئًا يجب أن تخاف منه. هي أداة تساعدك على فهم المشكلة وتصحيح الكود. تعلّم قراءة آخر سطر لمعرفة نوع الخطأ، ثم ارجع إلى رقم السطر واسم الملف لتعرف مكان المشكلة.

في هذا الدرس تعلمنا معنى Traceback، وكيف نقرأ أجزاء رسالة الخطأ، وراجعنا أشهر أخطاء Python للمبتدئين مثل SyntaxError و NameError و TypeError و ValueError و IndexError و KeyError. ومع التدريب ستصبح قراءة الأخطاء مهارة طبيعية جدًا في رحلتك مع البرمجة.

الخلاصة العملية: اقرأ آخر سطر لتعرف نوع الخطأ، ثم استخدم رقم السطر لتصل إلى مكان المشكلة، ولا تعدل الكود عشوائيًا. كل خطأ تفهمه اليوم سيختصر عليك وقتًا كبيرًا غدًا. {alertSuccess}

أسئلة شائعة مع إجاباتها

ما معنى Traceback في Python؟

هو تقرير يعرضه Python عند حدوث خطأ، ويوضح مسار تنفيذ الكود واسم الملف ورقم السطر ونوع الخطأ.

ما أهم جزء في رسالة الخطأ؟

غالبًا آخر سطر هو الأهم، لأنه يحتوي على نوع الخطأ وشرح مختصر لسببه.

هل رقم السطر في الخطأ دقيق دائمًا؟

غالبًا يساعدك على الوصول للمكان الصحيح، لكن في بعض أخطاء الأقواس والتنصيص قد يكون السبب الحقيقي في السطر السابق.

ما الفرق بين SyntaxError و Runtime Error؟

SyntaxError يحدث عندما تكون صياغة الكود غير صحيحة، أما أخطاء التشغيل فتحدث أثناء تنفيذ كود صحيح من ناحية الشكل لكنه يسبب مشكلة أثناء التشغيل.

كيف أتعامل مع ValueError؟

افحص القيمة التي تحاول استخدامها. مثلًا إذا كنت تستخدم int()، تأكد أن النص يحتوي على رقم فعلاً.

هل أستخدم try و except مع كل خطأ؟

لا. استخدم try و except مع الأخطاء المتوقعة مثل إدخال المستخدم أو قراءة الملفات، لكن لا تستخدمها لإخفاء الأخطاء بدون فهم.

إرسال تعليق

أحدث أقدم