שיעורי מודול (4/4)
טיפול בשגיאות: נסה/למעט
כאשר משהו משתבש בזמן ריצה (חלוקה באפס, מפתח חסר, א
פעולה על טיפוסים לא תואמים) Python מעלה חריג. בלי
טיפול, החריג קוטע את התוכנית. עם try / except אתה
יכול לתפוס את זה ולהחליט מה לעשות.
הצורה הבסיסית
try:
risultato = 10 / 0
except ZeroDivisionError:
risultato = None
risultato # None- הבלוק
try:מכיל את הקוד שעלול להיכשל; - ה-
except <ErrorType>:מבוצע רק אם סוג השגיאה הזה מועלה בתוךtry.
תופס את הודעת החריגה
השתמש ב-as כדי לאגד את האובייקט החריג לשם:
try:
int("non è un numero")
except ValueError as e:
messaggio = str(e)
messaggio # "invalid literal for int() with base 10: 'non è un numero'"מספר סוגים ביחד
try:
valore = dati[chiave]
except (KeyError, IndexError):
valore = Noneאוסף של טיפוסים תופס כל חריג מסוגים אלה (או תת-מחלקות).
המבנה המלא: נסה / למעט / אחר / לבסוף
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 exceptionelse- השתמש בו עבור קוד שתלוי בהצלחת ה-try. תשמור את זה נפרד כדי שלא תתפס בטעות חריגים לא קשורים.finally- ניקוי שחייב לקרות תמיד (סגירת קובץ, שחרור משאב). בוצע גם על הצלחה וגם על טעות.
העלאת חריג: raise
לפעמים אתה זה שרוצה לאותת שמשהו השתבש:
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: מופעל תמיד, ללא קשר אם התרחש חריג. זה אידיאלי לניקוי משאבים (למשל סגירת קובץ פתוח או חיבור למסד נתונים).
נסה זאת בעצמך
כתוב ביטוי שמנסה int('abc'): אם ValueError מועלה, הקצה את המחרוזת 'errore' ל'result'; אחרת הקצה את המספר. הערכת `תוצאה`.
הצג רמז
int('abc') מעלה את ValueError.
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
הגדר `divide(a,b)` אשר מחזירה a/b אך מעלה את ValueError עם ההודעה 'divisore zero' אם b הוא 0. לאחר מכן קרא divide(10, 0) בתוך try/except והקצה ל-`message` את המחרוזת של החריג שנתפס.
הצג רמז
raise ValueError('...') בתוך הפונקציה; לתפוס עם מלבד ValueError כ-e.
הפתרון זמין לאחר 3 ניסיונות
אתגר נוסף
כתוב בלוק \`try-except\` כדי להמיר את המחרוזת \`text_val = "abc"\` למספר שלם. אם ההמרה מעלה \`ValueError\`, הקצה \`None\` ל\`Result\`. אחרת, הקצה את המספר שהומר. לבסוף, הערך את \`תוצאה\`.
הצג רמז
השתמש ב- try: result = int(text_val) ואחריו למעט ValueError: result = None.
הפתרון זמין לאחר 3 ניסיונות