Cell In[1], line 1 if (x > 5) ^ SyntaxError: expected ':'
15 الخطأ
ينقسم الخطأ لثلاثة أنواع:
- الخطأ النحوي: وهو الخطأ في مبنى اللغة؛ أي: مخالفة قواعدها وقوانينها. (Syntactic Error)
- الخطأ المنطقي: وهو التعبير بخطوات صحيحة في ذاتها لكنها لا تؤول للنتيجة التي نهدف إليها. (Logical Error)
- الخطأ في الواقع: ويسمى الاستثناء وهو حالة غير مثالية يجب أن يتعامل معها الرنامج. (Runtime Error)
- يأتي الحديث عنه في الفصل التالي.
في هذا الفصل، نناقش كل نوع من الأخطاء وكيفية التعامل معها.
15.1 الخطأ النحوي: الخطأ في المبنى
الأخطاء النحوية تتعلق بتركيب اللغة لا أكثر ولا أقل. إليك ثلاثة أمثلة.
فقدان النقطتين :
علامات اقتباس غير متوازنة
اسم متغير غير صالح
أخطاء المحاذاة
من الأخطاء النحوية الشائعة في بايثون: أخطاء المحاذاة (Indentation Error).
وذلك أن بايثون تقبل نوعين من المسافات البادئة للسطر؛ إما بحرف المسافة التي بين الكلمات \s
أو بحرف المسافة بين الأعمدة \t
. وقد يستعمل بعض الناس هذه وبعضهم ذلك، ثم تأخذ كودًا من هنا وكودًا من هناك، فترى الكود عنك لا يعمل، والسبب هو الخلط بينهما في نفس الكود. وبايثون لا تقبل ذلك. فيجب توحيد النوع. إما هذه أو هذه. لذلك يضبط VS Code ومحررات الأكواد الأخرى تحويل البادئة تلقائيًا إلى مسافة أو العكس.
إليك بعض الأمثلة لما يحصل من أخطاء في المحاذاة:
عدم وجود مسافة بادئة، عندما تكون متوقعة:
Cell In[4], line 2 print("x") ^ IndentationError: expected an indented block after 'if' statement on line 1
عدم تطابق المحاذاة:
تجويد العبارة
من تجويد العبارة تسمية المتغيرات بما يدل على وظيفتها، مثل:
وإن كان ليس من الخطأ النحوي كتابتها بطريقة مختلفة وبأسماء غير معبِّرة، إلا أنه فعلٌ غير مستحسن:
وفي هذا نصائح كثيرة، يراجع فيها دليل أسلوب الكتابة في بايثون.
15.2 الخطأ المنطقي: الخطأ في المعنى
وهي التي نقصدها حين نقول: Bug، ولذلك قيل للبرنامج الذي يساعد في إصلاحها: Debugger، وعملية البحث عنها وإصلاحها: Debugging.
الأخطاء المنطقية صامتة. إذ لا يكتشفها المترجم، وتتسبب في تصرف البرنامج بشكل غير صحيح. الأخطاء المنطقية هي الأصعب في التتبع والإصلاح لأنها ليست واضحة. يمكن أن تكون ناجمة عن:
- افتراضات غير صحيحة
- تطبيق غير صحيح للخوارزمية أو
- تحضير غير صحيح للبيانات
اقرأ المزيد عن أنواع الأخطاء وإليك بعض الأمثلة.
استعمال الفعل الخاطئ
استعمال العامل الخاطئ
مستوى محاذاة خاطئ
هنا كانت النية تقتضي أن تكون print(j)
داخل الحلقة الداخلية:
خطأ الحافَّة
يكاد يكون أشهر الأخطاء في البرمجة: خطأ الحافَّة. ويسمى (Off-by-one error).
نشرحه بمثال: النية هنا هي طباعة الأرقام من 5 إلى 0 بما في ذلك 0، ولكن الحلقة تتوقف عند 1.
15.3 كشف الأخطاء المنطقية
لكونها جملاً صحيحة في ذاتها؛ لا يستطيع البرنامج كشف هذه الأخطاء لوحده. بل يجب على من يُدركُ حقيقة المطلوب من البرنامج أن يتكفل بذلك. وهنا تكون الحاجة ماسَّة لجمل التوكيد: assert
وقد رأيناها كثيرًا.
والتدقيق؛ إذْ أفضل طريقة لحل الأخطاء المنطقية هي تنفيذ الكود والنظر في الناتج، وتتبع المنطق مرة أخرى إلى الكود سطرًا بسطر. يمكنك استخدام عبارات الطباعة print
لتصحيح الأخطاء وفهم تدفق البرنامج. وقد يكون الأفضل من ذلك استعمال المدقق (Debugger).
مراجعة الأقران: بحيث يطلع على الكود شخص آخر، فإنه قد يرى منه ما تعذر عليك رؤيته. وقد يتم تنظيمه بين أعضاء الفريق الواحد بأحد برمجيات التعاون مثل: GitHub وGitLab وBitbucket وغيرها. لكن ليس شرطًا أن يكون بطريقة منظَّمة حتى تستفيد منه.