מירי
כיתה ח · תכנות בפייתון

מוצאים באגים בפייתון קוראים את השגיאה ועוקבים

כל מתכנת כותב באגים. מה שמבדיל מתכנת טוב הוא שהוא יודע למצוא אותם מהר. כאן לומדים לקרוא הודעת שגיאה של פייתון, להבדיל בין שגיאה שעוצרת את התוכנית לבין באג שקט, ולמצוא את השורה האשמה בעזרת מעקב והדפסות. את הרעיון בלי קוד פגשתם במצאו את הבאג. כדאי להכיר את הלולאות ואת הרשימות.

1

הרעיון

הודעת שגיאה נראית מפחידה, אבל היא עוזרת. קוראים אותה מלמטה: בשורה האחרונה כתוב סוג השגיאה ומה קרה, ומעליה מספר השורה בקוד.

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.
לזכור: השורה שבהודעה היא המקום שבו פייתון נתקעה. לפעמים הבאג עצמו נמצא בשורה מוקדמת יותר.
2

מעבדה: בלשי באגים

בחרו תוכנית עם המחוון או מ"נסו את אלה". הריצו אותה שורה אחרי שורה, קראו את הפלט ואת הודעת השגיאה, ואז בחרו את השורה שבה נמצא הבאג.

נסו את אלה:

באיזו שורה הבאג?

הריצו בעצמכם

אפשר לשנות את הקוד ולהריץ פייתון אמיתי. בפעם הראשונה הטעינה לוקחת כמה שניות. נסו לתקן את הבאג ולהריץ שוב.

3

טעויות שכולם עושים

= במקום ==

= שם ערך. == בודק אם שני ערכים שווים. בתוך 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)
4

דוגמה פתורה: מוצאים באג עם print

התוכנית אמורה לחבר את המספרים 1 עד 5, ולהדפיס 15. היא מדפיסה 10, בלי שום הודעת שגיאה. כדי לגלות למה, מוסיפים שורת print בתוך הלולאה (שורה 4), שמראה מה קורה בכל סיבוב. עברו צעד אחרי צעד והסתכלו בפלט.

5

תרגול


  

6

שאלות שכולם שואלים

איך קוראים הודעת שגיאה בפייתון?

מלמטה למעלה. בשורה האחרונה יש את סוג השגיאה, למשל NameError, ואחריו הסבר קצר. מעליה כתוב line ומספר: זו השורה שבה פייתון נעצרה, ומתחת מופיעה השורה עצמה. נסו במעבדה.

מה ההבדל בין שגיאה לבין באג לוגי?

שגיאה עוצרת את התוכנית ופייתון מודיעה עליה. באג לוגי שקט: התוכנית רצה עד הסוף אבל התוצאה לא נכונה. כדי למצוא אותו בודקים בעזרת דוגמה שיודעים את התשובה שלה, ועוקבים אחרי המשתנים.

מה עושים כשלא מוצאים את הבאג?

מוסיפים print באמצע הקוד כדי לראות את ערכי המשתנים, ממלאים טבלת מעקב, ומקצרים את הבעיה: מוחקים זמנית חלקים עד שמוצאים את השורה האשמה. לפעמים עוזר להסביר את הקוד בקול, שורה אחרי שורה. תרגלו למטה.