تعلّم فكّ رموز رسالة الخطأ بدل إغلاقها: النوع والملف والسطر وأثر الاستدعاء.
افتح هذا الدرس في Kodokonالخطأ ليس عقابًا. حاسوبك لا يحكم عليك ولا يسخر منك: لقد لاحظ أنه لا يعرف ما الذي يجب فعله، وهو يخبرك بالسبب. يعمل الأمر تمامًا كجهاز تحديد المواقع حين يعلن "إعادة حساب المسار": ليس هذا توبيخًا، بل معلومة. ردّ فعل المبتدئ هو إغلاق النافذة الحمراء دون قراءتها. أما ردّ فعل المطوّر فهو قراءتها بتمهّل، حتى آخر سطر. وهي غالبًا اللحظة الوحيدة التي تخاطبك فيها الآلة بكلام صريح.
تحتوي كل رسائل الخطأ تقريبًا على المعلومات نفسها. نوع الخطأ، الذي يصنّفه ضمن عائلة كبيرة. والرسالة، التي تشرح في جملة واحدة ما الذي لا يسير على ما يرام. والملف المعنيّ ورقم السطر، وهما يدلّانك بالضبط على موضع البحث. وأحيانًا أثر الاستدعاء (stack trace): قائمة الخطوات التي مرّ بها البرنامج قبل أن يتعطّل.
Traceback (most recent call last):
File "shopping.py", line 12, in <module>
total = price * quantity
NameError: name 'quantity' is not definedفي المثال أعلاه، كل شيء مذكور بوضوح. الملف هو shopping.py، والسطر هو 12، والنوع هو NameError، والرسالة تقول name 'quantity' is not defined. وبكلام بسيط: في السطر 12 تستخدم متغيّرًا اسمه quantity لم تُنشئه قط، أو أخطأت في كتابة اسمه. لا حاجة إلى تحقيق معقّد - فالرسالة كانت تحمل الجواب أصلًا.
يُقرأ أثر الاستدعاء في Python من الأسفل إلى الأعلى: السطر الأخير يعطي النوع والشرح، وفوقه مباشرة يوجد الملف والسطر المُخطئ. وحين يكون الأثر طويلًا جدًّا، ابحث عن أول سطر يذكر ملفك أنت. أما الأسطر التي تشير إلى ملفات مجهولة بأسماء غريبة فهي تخصّ المكتبات التي تستخدمها: في 99% من الحالات ليست هي المعطوبة، بل طريقتك في استدعائها.
Uncaught TypeError: Cannot read properties of
undefined (reading 'name')
at showProfile (app.js:24:18)
at start (app.js:41:3)تتكرّر بضع صياغات باستمرار، ومن المفيد أن تتعرّف عليها. not defined تعني أن الاسم الذي استخدمته غير موجود في ذلك الموضع. وundefined تعني أن الشيء موجود لكنه لا يحمل أي قيمة. وunexpected تعني أن البرنامج كان يتوقّع شيئًا آخر، وغالبًا قوسًا أو علامة تنصيص منسيّة. وpermission denied تشير إلى مشكلة صلاحيات، لا إلى مشكلة في الكود. وno such file or directory تعني أن المسار الذي كتبته لا يؤدّي إلى أي مكان.
not defined؟