بسم الله الرحمن الرحيم والصلاة والسلام على سيدنا محمد وعلى آله وصحبه ومن تبعهم بإحسان إلى يوم الدين وبعد:
في البداية يجب أن نعلم أن رسائل الخطأ المزعجة المكتوبة باللون الأحمر ليس الغرض منها هو مضايقتك -كمبرمج مبتدئ-، وليس الغرض منها هو إظهار أنك فاشل، ولن تتعلم البرمجة، أبدًا!
رسائل الخطأ هي معلمك الذي يخبرك أين أخطأت، وفيم أخطأت، وماذا عليك فعله لإصلاح خطأك. وفي هذه المقالة بإذن الله سوف نتعرف على رسائل الأخطاء، وأنواعها، وكيف نستخرج المعلومات من تلك الرسائل، ونستخدمها في الوصول إلى الحل.
أنواع الأخطاء
هناك على الأقل نوعان من الأخطاء في البايثون، والتي تختلف عن بعضها البعض. **أولها تلك الأخطاء التي تتعلق بتركيب الكود**، بالإنجليزية `syntax error` وهي الأخطاء التي تحدث نتيجة الإخلال بقواعد الكتابة في البايثون. مثل فتح القوس `) ` مع عدم إغلاقه بشكل صحيح باستخدام غلقه القوس `(` والتي يعرضها المثال التالي:
print("Hello, world!"
النتيجة:
File "<stdin>", line 1
print("Hello, world!"
^
SyntaxError: unexpected EOF while parsing
كما نرى بالفقرة السابقة، والتي تعرض النتيجة، طبعت لنا البايثون خطئا من النوع الذي يخص تركيب الكود، والإخلال بقواعد الكتابة في لغة البايثون، وهو عدم إغلاق القوس. ولكي نحلها، سنحتاج إلى إغلاق القوس الخاص بدالة الطباعة بهذا الشكل print("Hello, world!")
ونلاحظ أن هذا النوع من الأخطاء يتميز غالبا بوجود علامة ^
، والتي تدل على مكان وجود الخطأ، أو بدايته. وغالبا ما تكون هذه العلامة دقيقة في معرفة مكان الخطأ.
بعض الأمثال على أخطاء مختلفة تتسبب في ظهور خطأ مخالفة قواعد الكتابة syntax error
:
>>> -name = "Mohamed"
File "<stdin>", line 1
SyntaxError: cannot assign to operator
السبب: البدء بعامل الطرح
>>> if name == "Moahmed" print("Welcome")
File "<stdin>", line 1
if name == "Moahmed"
^
SyntaxError: invalid syntax
السبب: نسيان علامة :
بعد تمام الشرط.
>>> if 1 < 2:
... print("math is right!")
File "<stdin>", line 2
print("math is right!")
^
IndentationError: expected an indented block
على الرغم من أن رسالة الخطأ لا تذكر Syntax error
، ولكن الخطأ التالي (خطأ مسافات التنسيق) يعد من أخطاء الإخلال بقواعد الكتابة باللغة Syntax error
وسبب الخطأ هو نسيان المسافات داخل ال if
والصواب كالتالي:
if 1 < 2:
print("math is right!")
هناك العديد من الأسباب التي قد تتسبب في هذا الخطأ، ولكن حتى لا نطيل عليكم في هذا الجزء، سنكتفي بهذا القدر. ونرجو وصول الفكرة من الأمثلة السابقة، والقدرة على تتبع الأخطاء المشابهة في المستقبل.
النوع الثاني من الأخطاء
أما عن النوع الثاني من الأخطاء وهو الاستثناءات، بالإنجليزية `Exception`، وهذا النوع من الأخطاء؛ وعلى الرغم من عدم وجود خطأ في قواعد الكتابة، ولكن مع ذلك يظهر هذا الخطأ عندما يكون هناك خلل في القواعد العامة للغة، أو الأخطاء المنطقية، أو الأخطاء التي تتعلق بسوء استخدام أحد الدوال.
وتظهر هذه الأخطاء لإخبار المبرمج أن هناك مدخلًا خطأً، أو أن هناك حدثًا معينًا منع الكود من العمل مع تفاصيل عن هذا الحدث، ومكان وقوعه. وقد يتضمن أحيانا توجيهات لحل المشكلة. ويختلف هذا النوع من الأخطاء عن النوع الأول أيضا؛ بأن الجهة التي تقوم بإصدار هذا الخطأ ليس بالضرورة أن تكون المعالج الخاص بالبايثون نفسه فقط، بل يمكن لمطور مكتبة ما إصدار نوع من الخطأ مع رسالة تفيد بسبب الخطأ. أمثلة على مثل هذا النوع من الأخطاء:
>>> print(name)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'name' is not defined
كما نرى في المثال السابق رسالة الخطأ تقول “خطأ تسمية، الاسم ‘name’ غير معرف”.
وكما تدل رسالة الخطأ فإن هذه المشكلة تتعلق بعدم تعريف المتغير name
. وحلها يكون في تعريف المتغير قبل محاولة طباعته.
>>> 4 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
كما نرى فإن الخطأ التالي يقول “خطأ القسمة على صفر: القسمة على الصفر” أي أنك حاولت القسمة على صفر، وهذا غير ممكن رياضيا.
قد تصادفنا أحيانا أخطاء من نوع الاستثناءات ولا نستطيع فهمها بشكل مباشر، ويكون الحل في البحث عن هذا الخطأ باستخدام آخر سطر في الرسالة والبحث عن ذلك الخطأ في أحد محركات البحث، أو الوثائق الخاصة بالكود المستخدم سواء كان مكتبة أو مشروع خاص.
نكتفي بهذا القدر حتى لا يمل منا أحد، وبإذن الله نستكمل الشرح بمستوى أعلى في موضوع آخر. ونتعرف على الأخطاء التي تتسبب في أخطاء، وسنتناقش حول كيفية معالجة تلك الأخطاء. إن أحيانا الله تعالى. وفي الختام أقول كما قال الحبيب صلى الله عليه وسلم (اللهم انفعني بما علمتني، وعلمني ما ينفعني، وارزقني علما تنفعني به) حديث صحيح على شرط مسلم.
هذا الموضوع فائز بجائزة أسس للكتابة
هذا الموضوع أحد المواضيع الفائزة بجائزة أسس للكتابة، الجائزة الاولى في العالم العربي للتحفيز الكتابة عن البرمجيات الحرة.
تفاصيل أكثر عن الجائزة

المواضيع الفائزة لشهر أبريل ومايو 2022

