דילוג לתוכן המרכזי
מודול 2 · שיעור 4 מתוך 48/36 בקורס~12 min
שיעורי מודול (4/4)

טיפול בשגיאות: נסה/למעט

כאשר משהו משתבש בזמן ריצה (חלוקה באפס, מפתח חסר, א פעולה על טיפוסים לא תואמים) Python מעלה חריג. בלי טיפול, החריג קוטע את התוכנית. עם try / except אתה יכול לתפוס את זה ולהחליט מה לעשות.

הצורה הבסיסית

Python
try:
    risultato = 10 / 0
except ZeroDivisionError:
    risultato = None
risultato  # None
  • הבלוק try: מכיל את הקוד שעלול להיכשל;
  • ה-except <ErrorType>: מבוצע רק אם סוג השגיאה הזה מועלה בתוך try.

תופס את הודעת החריגה

השתמש ב-as כדי לאגד את האובייקט החריג לשם:

Python
try:
    int("non è un numero")
except ValueError as e:
    messaggio = str(e)
messaggio  # "invalid literal for int() with base 10: 'non è un numero'"

מספר סוגים ביחד

Python
try:
    valore = dati[chiave]
except (KeyError, IndexError):
    valore = None

אוסף של טיפוסים תופס כל חריג מסוגים אלה (או תת-מחלקות).

המבנה המלא: נסה / למעט / אחר / לבסוף

Python
try:
    n = int("42")
except ValueError:
    print("not a number")
else:
    print(f"parsed: {n}")     # executed only if NO exception occurred
finally:
    print("always executed")  # executed regardless, even on exception
  • else - השתמש בו עבור קוד שתלוי בהצלחת ה-try. תשמור את זה נפרד כדי שלא תתפס בטעות חריגים לא קשורים.
  • finally - ניקוי שחייב לקרות תמיד (סגירת קובץ, שחרור משאב). בוצע גם על הצלחה וגם על טעות.

העלאת חריג: raise

לפעמים אתה זה שרוצה לאותת שמשהו השתבש:

Python
def diviso(a, b):
    if b == 0:
        raise ValueError("the divisor cannot be zero")
    return a / b

החריגים המובנים הנפוצים ביותר שתתקלו בהם ותעלו:

  • ValueError - לערך יש את הסוג הנכון אבל הוא לא מקובל (למשל ניתוח).
  • TypeError - הסוג שגוי (למשל len(42)).
  • KeyError / IndexError - מפתח/אינדקס חסר.
  • ZeroDivisionError - חלוקה באפס.
  • FileNotFoundError, PermissionError - פעולות של מערכת הקבצים.

הסעיפים האחרים ולבסוף בלוקים לנסות

בלוק try יכול להגדיר שני סעיפים נוספים:

  • else: מבוצע רק אם הבלוק try מסתיים מבלי להעלות חריגים.
  • finally: מופעל תמיד, ללא קשר אם התרחש חריג. זה אידיאלי לניקוי משאבים (למשל סגירת קובץ פתוח או חיבור למסד נתונים).

נסה זאת בעצמך

פעילות גופנית#python.m2.l4.e1
ניסיונות: 0טוען...

כתוב ביטוי שמנסה int('abc'): אם ValueError מועלה, הקצה את המחרוזת 'errore' ל'result'; אחרת הקצה את המספר. הערכת `תוצאה`.

טוען עורך...
הצג רמז

int('abc') מעלה את ValueError.

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#python.m2.l4.e2
ניסיונות: 0טוען...

הגדר `divide(a,b)` אשר מחזירה a/b אך מעלה את ValueError עם ההודעה 'divisore zero' אם b הוא 0. לאחר מכן קרא divide(10, 0) בתוך try/except והקצה ל-`message` את המחרוזת של החריג שנתפס.

טוען עורך...
הצג רמז

raise ValueError('...') בתוך הפונקציה; לתפוס עם מלבד ValueError כ-e.

הפתרון זמין לאחר 3 ניסיונות

אתגר נוסף

פעילות גופנית#python.m2.l4.e3
ניסיונות: 0טוען...

כתוב בלוק \`try-except\` כדי להמיר את המחרוזת \`text_val = "abc"\` למספר שלם. אם ההמרה מעלה \`ValueError\`, הקצה \`None\` ל\`Result\`. אחרת, הקצה את המספר שהומר. לבסוף, הערך את \`תוצאה\`.

טוען עורך...
הצג רמז

השתמש ב- try: result = int(text_val) ואחריו למעט ValueError: result = None.

הפתרון זמין לאחר 3 ניסיונות