מה זה Runtime Error (שגיאת זמן ריצה)?
שגיאת זמן ריצה (runtime error) היא שגיאה שקורית בזמן שהתוכנית רצה, כשאי אפשר לבצע פעולה עם הערכים שיש לה, למשל חלוקה באפס או קריאה מעבר לסוף של רשימה. התוכנית נעצרת בשורה הזו, אלא אם השגיאה מטופלת.
עודכן ב-24 בספטמבר 2026
שגיאת זמן ריצה מחכה עד שהתוכנית כבר רצה. הקוד עובר את כל הבדיקות לפני שהוא מתחיל, רץ כמו שצריך במשך זמן מה, ואז מגיע לפעולה שאי אפשר לבצע עם הערכים שיש לו באותו רגע. הפונקציה הזו עובדת עם רשימה אחת ונכשלת עם אחרת:
85.0
Traceback (most recent call last):
File "main.py", line 5, in <module>
print(average([]))
^^^^^^^^^^^
File "main.py", line 2, in average
return sum(scores) / len(scores)
~~~~~~~~~~~~^~~~~~~~~~~~~
ZeroDivisionError: division by zero
הקריאה הראשונה מדפיסה 85.0. הקריאה השנייה מעבירה רשימה ריקה, ולכן len(scores) שווה 0 והחלוקה לא יכולה להתבצע. לא הייתה שום בעיה בדקדוק, ולכן זו לא שגיאת תחביר. הבעיה קיימת רק עם נתונים מסוימים, ובגלל זה שגיאת זמן ריצה יכולה להופיע אחרי שתוכנית עבדה כמו שצריך מאה פעמים.
מה קורה כששגיאת זמן ריצה מתרחשת
- התוכנית מגיעה לפעולה, כאן
sum(scores) / len(scores). - סביבת הריצה (runtime) בודקת אותה לפני שהיא מבצעת אותה. CPython בודק את המחלק לפני החלוקה, ה-JVM בודק כל אינדקס של מערך, ו-Python בודק שמפתח קיים במילון לפני שהוא מחזיר את הערך שלו.
- הבדיקה נכשלת, ולכן סביבת הריצה יוצרת אובייקט שגיאה. ב-Python וב-Java האובייקט הזה הוא חריגה (exception), והוא מתעד את סוג השגיאה, הודעה, והמקום שבו היא קרתה.
- סביבת הריצה מחפשת קוד שמטפל בסוג השגיאה הזה, קודם בפונקציה הנוכחית, אחר כך בפונקציה שקראה לה, וכך הלאה החוצה.
- אם שום דבר לא מטפל בה, התוכנית נעצרת. Python מדפיס traceback ויוצא עם קוד יציאה 1. Java מדפיס stack trace שמתחיל ב-
Exception in thread "main".
שפות בלי הבדיקות האלה מתנהגות אחרת. C לא בודקת אינדקסים של מערכים או מצביעים, ולכן גישה שגויה לזיכרון או משבשת נתונים בשקט, או גורמת למערכת ההפעלה לסיים את התוכנית עם segmentation fault.
כל מה שהתוכנית עשתה לפני השורה שנכשלה כבר קרה. הלולאה הזו מדפיסה שלושה צבעים לפני שהיא נכשלת ברביעי:
red
green
blue
Traceback (most recent call last):
File "main.py", line 4, in <module>
print(colors[i])
~~~~~~^^^
IndexError: list index out of range
איך קוראים traceback
קוראים traceback של Python מלמטה למעלה. השורה האחרונה מציינת את סוג השגיאה ואת ההודעה: ZeroDivisionError: division by zero. השורות שמעליה מפרטות את שרשרת הקריאות, מהישנה ביותר ועד האחרונה. בדוגמה הראשונה, שורה 5 קראה ל-average, ושורה 2, בתוך average, היא המקום שבו החלוקה נכשלה.
השורה שבה השגיאה קרתה היא לא תמיד השורה שצריך לשנות. שורה 2 של average תקינה. השאלה האמיתית היא איך רשימה ריקה הגיעה אליה, אז עקבו אחרי הערך השגוי אחורה עד המקום שממנו הוא הגיע ותקנו אותו שם. כשה-traceback עובר דרך קבצים של ספריות שלא אתם כתבתם, חפשו את השורה האחרונה שמצביעה לקובץ שלכם.
שגיאות זמן ריצה נפוצות
כל אחת מההודעות האלה הועתקה מ-Python 3.12.
| שגיאה | דוגמה | הודעה |
|---|---|---|
ZeroDivisionError | 10 / 0 | division by zero |
IndexError | ["red", "green", "blue"][3] | list index out of range |
KeyError | {"theme": "dark"}["font"] | 'font' |
ValueError | int("twenty") | invalid literal for int() with base 10: 'twenty' |
TypeError | "Total: " + 5 | can only concatenate str (not "int") to str |
AttributeError | קריאה למתודה .upper() על None | 'NoneType' object has no attribute 'upper' |
FileNotFoundError | open("missing.txt") | [Errno 2] No such file or directory: 'missing.txt' |
RecursionError | פונקציה שקוראת לעצמה בלי סוף | maximum recursion depth exceeded |
ל-Java יש מקבילות ישירות, כמו ArithmeticException, ArrayIndexOutOfBoundsException, NumberFormatException ו-NullPointerException. חלוקה של מספר שלם באפס שאף אחד לא תופס מדפיסה ב-Java את זה:
Exception in thread "main" java.lang.ArithmeticException: / by zero
JavaScript סלחנית יותר עם מספרים: 10 / 0 הוא Infinity, לא שגיאה. היא נכשלת כשמשתמשים בערך שלא קיים. Node.js מדפיס את זה עבור user.name כש-user הוא undefined:
TypeError: Cannot read properties of undefined (reading 'name')
איך מתקנים שגיאת זמן ריצה
- שחזרו אותה. הריצו את התוכנית שוב עם אותו קלט וודאו שאתם מקבלים את אותה שגיאה.
- קראו את השורה האחרונה של ה-traceback, ואז מצאו את השורה המתאימה בקוד שלכם.
- הסתכלו על הערכים המעורבים. הדפיסו אותם ממש לפני השורה שנכשלת, או עצרו שם עם נקודת עצירה (breakpoint) בדיבאגר.
- תקנו את הסיבה. תקנו את האינדקס, הגנו על המקרה המיוחד, או אמתו את הקלט לפני שמשתמשים בו.
בפונקציה average, התיקון הוא להחליט מה צריך להיות הממוצע של אפס ציונים ולכתוב את זה בקוד:
85.0
0
חלק מהכשלים לא בשליטתכם: קובץ שנמחק, רשת שחורגת מזמן ההמתנה, משתמש שמקליד אותיות במקום שבו צריך מספר. אי אפשר למנוע אותם בתיקון הקוד, ולכן תופסים אותם עם טיפול בחריגות ומחליטים מה התוכנית עושה אחר כך. מה שלא כדאי לעשות הוא לעטוף באג ב-try ולהסתיר אותו. IndexError מלולאה שסופרת צעד אחד יותר מדי היא טעות שצריך לתקן, לא שגיאה שצריך לתפוס.
הודעות runtime error ב-Windows וב-Excel
המונח מופיע גם מחוץ לקוד שלכם. חלון של Windows שכותרתו Microsoft Visual C++ Runtime Library עם המילים Runtime Error! אומר שתוכנית שנכתבה ב-C++ נתקלה בשגיאה קריטית, וסביבת הריצה של C++ סגרה אותה. כמשתמשים אי אפשר לשנות את הקוד הזה, ולכן הפתרונות הרגילים הם לעדכן את התוכנית, לתקן או להתקין מחדש את חבילות Microsoft Visual C++ Redistributable, ובמשחקים, לעדכן את מנהל ההתקן של כרטיס המסך.
מאקרו של Excel שנכתב ב-VBA מדווח על שגיאות זמן ריצה ממוספרות. Run-time error '9': Subscript out of range אומרת שהמאקרו ביקש גיליון או איבר במערך שלא קיימים, ו-Run-time error '1004' היא שגיאה כללית שמופיעה כשפעולה על חוברת עבודה, גיליון או טווח נכשלת. הרעיון זהה לזה שב-Python: קוד תקין שנתקל בערך שלא יכול היה לטפל בו.
לאן ממשיכים מכאן
לשגיאות זמן ריצה יש שני אחים: שגיאת התחביר, שמתגלה לפני שהתוכנית מתחילה, והשגיאה הלוגית, שלא מייצרת אף הודעה. כדי להתאושש משגיאות זמן ריצה במקום לקרוס, קראו על טיפול בחריגות ואחר כך את המדריכים של Python על חריגות ועל דיבוג שגיאות. בקורס Python תכתבו ותתקנו קוד כזה בכל שיעור.
שאלות נפוצות
מה ההבדל בין שגיאת זמן ריצה לשגיאת תחביר?
למה שגיאות זמן ריצה חוזרות אצלי שוב ושוב?
מה המשמעות של Runtime Error ב-LeetCode?
None, או רקורסיה עמוקה כל כך שהמחסנית גולשת. הריצו בעצמכם את הקלט שנכשל, שמופיע בדף התוצאות, ובדקו את מקרי הקצה: מערך ריק, איבר אחד, והגודל המקסימלי המותר.האם שגיאת זמן ריצה זה אותו דבר כמו חריגה (exception)?
RuntimeException הוא גם השם של משפחה מסוימת של חריגות, אלה שאינן נבדקות (unchecked), כמו NullPointerException.