לדלג לתוכן

איך לטפל בשגיאות בפייתון נכון - ולא רק להסתיר אותן

בואו נדבר בכנות. כמעט כל מתחיל, ברגע שהוא נתקל בשגיאה אדומה מפחידה בפעם הראשונה, לומד טריק אחד - לעטוף הכל ב-try except ולתת ל-except להיות ריק. השגיאה נעלמת, התוכנית רצה, כולם מרוצים. חוץ מזה שזה בדיוק ההרגל שהופך אתכם למתכנתים גרועים, וגם ההרגל הכי נפוץ שאני רואה אצל מתחילים.

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

מה זה בכלל try except

כשפייתון נתקלת בבעיה בזמן ריצה - קובץ שלא קיים, חלוקה באפס, משתמש שהקליד טקסט במקום מספר - היא זורקת exception, ואם לא תופסים אותו התוכנית קורסת. try except נותן לכם דרך לתפוס את השגיאה ולהחליט מה לעשות איתה, בלי שהתוכנית תתרסק.

try:
    number = int(input("הכניסו מספר: "))
    print(100 / number)
except ValueError:
    print("זה לא היה מספר תקין")
except ZeroDivisionError:
    print("אי אפשר לחלק באפס")

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

הטעות המסוכנת ביותר - except כללי וריק

try:
    do_something_complicated()
except:
    pass

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

חשוב עוד יותר - except: בלי לציין סוג שגיאה תופס גם דברים כמו KeyboardInterrupt, כלומר גם אם המשתמש לוחץ Ctrl+C כדי לעצור את התוכנית, היא פשוט תתעלם מזה. זה כמעט תמיד לא מה שרציתם.

אז מה כן עושים

קודם כל, תפסו שגיאות ספציפיות. אתם יודעים ש-int() יכול לזרוק ValueError? תתפסו בדיוק את זה. פתיחת קובץ יכולה לזרוק FileNotFoundError? תתפסו את זה. זה מכריח אתכם לחשוב באמת מה יכול להשתבש, במקום לזרוק רשת ענקית שתופסת הכל.

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

try:
    risky_operation()
except Exception as e:
    print(f"קרתה שגיאה: {e}")

זה עדיין לא מושלם, אבל לפחות אתם רואים מה קרה במקום שזה יעלם בשקט.

finally ו-else - החברים הפחות מוכרים

finally הוא בלוק שרץ תמיד, בין אם הייתה שגיאה ובין אם לא. שימושי מאוד לסגירת קבצים או חיבורים, אף על פי שהיום עדיף בדרך כלל להשתמש ב-with בשביל זה. else רץ רק אם ה-try הצליח בלי שגיאה בכלל, ומשמש בעיקר להפריד בין הקוד ה"מסוכן" לקוד שרץ רק אחרי הצלחה.

try:
    file = open("data.txt")
except FileNotFoundError:
    print("הקובץ לא נמצא")
else:
    print(file.read())
    file.close()
finally:
    print("סיימנו לנסות")

אל תשתמשו ב-try except כדי להתחמק מבדיקות

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

הכלל שאני נותן לכל תלמיד

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

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

למדו טיפול נכון בשגיאות בקורס תכנות בסיסי

יש לכם שגיאה שאתם לא מבינים איך לתפוס נכון? זה בדיוק סוג השאלה שכדאי לשאול בקהילה.

הצטרפו לקהילה בדיסקורד

לסיכום

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