כל מתכנת כותב באגים. מה שמבדיל מתכנת טוב הוא שהוא יודע למצוא אותם מהר. כאן לומדים לקרוא הודעת שגיאה של פייתון, להבדיל בין שגיאה שעוצרת את התוכנית לבין באג שקט, ולמצוא את השורה האשמה בעזרת מעקב והדפסות. את הרעיון בלי קוד פגשתם במצאו את הבאג. כדאי להכיר את הלולאות ואת הרשימות.
הודעת שגיאה נראית מפחידה, אבל היא עוזרת. קוראים אותה מלמטה: בשורה האחרונה כתוב סוג השגיאה ומה קרה, ומעליה מספר השורה בקוד.
Traceback (most recent call last):
File "main.py", line 3, in <module>
print(score + bonsu)
NameError: name 'bonsu' is not defined. Did you mean: 'bonus'?
הקוד לא כתוב לפי הכללים: חסרות נקודתיים, סוגר, או הזחה. פייתון בודקת את כל הקובץ לפני שהיא מתחילה, ולכן אף שורה לא רצה.
הקוד כתוב נכון, אבל משהו נכשל בזמן הריצה: שם שלא קיים, חילוק ב-0, אינדקס מחוץ לרשימה. השורות שלפני השגיאה כבר רצו.
אין שום הודעה. התוכנית רצה עד הסוף, אבל התשובה לא נכונה. מוצאים אותו בעזרת טבלת מעקב או print באמצע הקוד.
| השגיאה | מה היא אומרת |
|---|---|
| SyntaxError | הקוד לא כתוב לפי הכללים. למשל חסרות נקודתיים. |
| IndentationError | הזחה לא נכונה. למשל גוף של לולאה שלא זז פנימה. |
| NameError | שם שפייתון לא מכירה. בדרך כלל שגיאת כתיב. |
| TypeError | פעולה על סוג לא מתאים. למשל טקסט ועוד מספר. |
| IndexError | אינדקס שאין ברשימה. |
| ZeroDivisionError | חילוק ב-0. |
בחרו תוכנית עם המחוון או מ"נסו את אלה". הריצו אותה שורה אחרי שורה, קראו את הפלט ואת הודעת השגיאה, ואז בחרו את השורה שבה נמצא הבאג.
נסו את אלה:
אפשר לשנות את הקוד ולהריץ פייתון אמיתי. בפעם הראשונה הטעינה לוקחת כמה שניות. נסו לתקן את הבאג ולהריץ שוב.
= שם ערך. == בודק אם שני ערכים שווים. בתוך if צריך ==.
✗ SyntaxError
if lives = 0:
print("Game over")✓ בדיקה
if lives == 0:
print("Game over")אי אפשר לחבר מחרוזת ומספר עם +. שימו פסיק ב-print, או המירו עם str.
✗ TypeError
print("Score: " + 5)✓ עובד
print("Score:", 5)
print("Score: " + str(5))ב-IndexError השגיאה מופיעה איפה שניגשים לרשימה, אבל לרוב הבאג הוא ב-range שלפני.
✗ range ארוך מדי
for i in range(4):
print(colors[i])✓ לפי האורך
for i in range(len(colors)):
print(colors[i])בפייתון Score ו-score הם שני שמות שונים. גם Print עם P גדולה נותן NameError.
✗ NameError
score = 3
Print(Score)✓ תקין
score = 3
print(score)התוכנית אמורה לחבר את המספרים 1 עד 5, ולהדפיס 15. היא מדפיסה 10, בלי שום הודעת שגיאה. כדי לגלות למה, מוסיפים שורת print בתוך הלולאה (שורה 4), שמראה מה קורה בכל סיבוב. עברו צעד אחרי צעד והסתכלו בפלט.
מלמטה למעלה. בשורה האחרונה יש את סוג השגיאה, למשל NameError, ואחריו הסבר קצר. מעליה כתוב line ומספר: זו השורה שבה פייתון נעצרה, ומתחת מופיעה השורה עצמה. נסו במעבדה.
שגיאה עוצרת את התוכנית ופייתון מודיעה עליה. באג לוגי שקט: התוכנית רצה עד הסוף אבל התוצאה לא נכונה. כדי למצוא אותו בודקים בעזרת דוגמה שיודעים את התשובה שלה, ועוקבים אחרי המשתנים.
מוסיפים print באמצע הקוד כדי לראות את ערכי המשתנים, ממלאים טבלת מעקב, ומקצרים את הבעיה: מוחקים זמנית חלקים עד שמוצאים את השורה האשמה. לפעמים עוזר להסביר את הקוד בקול, שורה אחרי שורה. תרגלו למטה.