קבצים ושגיאות
הוצג| English | משמעות |
|---|---|
| exception/ekˈsepʃn/ | חריגה |
מדוע המשחק קורס עבור שחקנים חדשים?
- משחק קורא את גודל הטקסט של השחקן מתוך
settings.txt. זה עובד במחשב המפתח. בפעם הראשונה של שחקן חדש אין עוד קובץ, והמשחק נעצר עםFileNotFoundError. - תוכניות נתונות לעולם מבולגן: קבצים חסרים, טעויות הקלדה, נתונים לקויים. שיעור זה מראה כיצד לקרוא ולכתוב קבצים, וכיצד לתכנן את השגיאות הצפויות.
קריאת קובץ
with open("scores.txt") as f:פותח את הקובץ וסוגר אותו בעצמו כשחסימה נגמר, גם אם טעות קורית בפנים.- חריגה על
for line in f:נותנת שורה אחת בכל פעם, עם ה-"\n"שלה בסוף. קרא אתline.strip()לפני שמתפרק או ממיר אותה.
total = 0
with open("scores.txt") as f: # Ana,72 Ben,55 Cai,90
for line in f:
name, mark = line.strip().split(",")
total += int(mark)
print(total) # 217
קובץ מכיל שלוש שורות: Ana,72, Ben,55, Cai,90. הלולאה מוסיפה int(line.strip().split(",")[1]) לכל שורה. מה הסכום הכולל?
רמת קושי 1/5 · 100 מטבעות + בונוס קטן בהשלמה הראשונה היום
$72 + 55 + 90 = 217$. strip() מסיר את "\n", split(",") מפריד את השם מהציון, ו-[1] לוקח את הציון.
כתיבה לקובץ
open(path, "w")מנקה את הקובץ תחילה, ואז כותב.open(path, "a")מצטרף בסוף ושומר על מה שהיה שם.f.write()לוקח מחרוזת ומוסיף ללא הפסקת שורה, אז כתובf.write(name + "\n")אוf.write(f"{name},{mark}\n").
התאם כל מצב למה שהוא עושה.
רמת קושי 2/5 · 140 מטבעות + בונוס קטן בהשלמה הראשונה היום
"r" היא ברירת המחדל. בחירת "w" לקובי יומן שהייתה אמור להרחיב תרוקן אותו בכל ריצה.
לשגיאות יש שמות
- כשדבר קורה לא נכון, Python מייצרת שגיאה, וכל סוג יש לו שם:
FileNotFoundError(קובץ לא קיים),ValueError(int("x")),KeyError(מקור במילון חסר),TypeError("a" + 1),ZeroDivisionError(1 / 0). - השם הוא השורה המועילה ביותר בהודעת השגיאה. קרא אותה תחילה, ואז את מספר השורה מעליה.
התאם כל שורה לסטייה שהיא גורמת.
רמת קושי 2/5 · 140 מטבעות + בונוס קטן בהשלמה הראשונה היום
A ValueError הוא סוג נכון עם ערך שגוי; A TypeError הוא סוג שגוי לפעולה.
ניסיון וחריגה
- הכנס את השורות הסיכון בחוסת
try:ובתוכנית לחריגה בשם ספציפי בחוסתexcept ValueError:. אם שגיאה זו קוראת, Python זועפת ישירות לחוסתexcept. - שורות בחוסת
tryלאחר השורה הכושלת נידחות. קוד לאחר כלל החוסתtry … exceptנעשה כרגיל.
try:
print("A")
n = int("seven") # ValueError here
print("B") # skipped
except ValueError:
print("C")
print("D") # prints A, C, D
מה מדפיא התוכנית A/B/C/D? try: מדפיא A, רץ int("seven"), מדפיא B; except ValueError: מדפיא C; לאחר מכן D מודפס אחרי החסימה.
רמת קושי 1/5 · 100 מטבעות + בונוס קטן בהשלמה הראשונה היום
A מודפס, ואז int("seven") גורם לסטייה. שאר החסימה try, כולל B, מוחלצת; C רץ; D רץ כי הוא אחרי החסימה כולה.
שאל שוב עד שהקלט תקין
- הכנס
try … exceptבתוך מחזורwhile True:. ערך טוב מגיע ל-return, שיורש את המחזור והפונקציה יחד. ערך רע נתפס, והמחזור שואל שוב. - המשתמש שמקליד
xואז4רואה הודעה אחת והתוכנית ממשיכה עם4.
def read_count():
while True:
try:
return int(input("How many? "))
except ValueError:
print("Whole numbers only.")
משתמש הזין x, אחר כך 2.5, ואז 4 לתוך read_count(). כמה פעמים מודפסת ההודעה "מספרים שלמים בלבד"?
רמת קושי 2/5 · 140 מטבעות + בונוס קטן בהשלמה הראשונה היום
int("x") ו-int("2.5") שניהם גורמים ל-ValueError, אז ההודעה מופיעה פעמיים. int("4") עובד ו-return מסיים את הלולאה.
תוצאה אחת, מספר דרכים
- קוד חזק מנסה את הדרך הרגילה, מיישם שם לכל כשל מצופה ומעניק לכל אחד מהם מענה ברירת מחדל סביר. הקורא מקבל תמיד תוצאה שימושי.
- תפס רק מה שיש לך תוכנית עבורו. טעות הקלדה בקוד שלך אמורה עדיין לגרום לקריסה רועשת כדי שתוכל למצוא אותה.

- קרא את גודל הטקסט מ-
settings.txt; השתמש ב-12 אם הקובץ חסר או אינו מכיל מס שלם. try:פותח את הקובץ ו-size = int(f.read().strip()).except FileNotFoundError: size = 12וexcept ValueError: size = 12.- קובץ המכיל
16נותן 16; אין קובץ נותן 12; קובץ המכילbigנותן 12. משתמשים חדשים אינם רואים עוד קריסה.
סדרו את שורות קורא ההגדרות בסדר הנכון.
רמת קושי 3/5 · 200 מטבעות + בונוס קטן בהשלמה הראשונה היום
הפעלה והמרה הסיכוןיות נכנסות לtry. פריט except אחד יכול לציין שני שגיאות בטופל כאשר לשניהן מיועדת אותה תוצאה ברירת מחדל.
סימונים נופלים מהיד
except:עירום. הוא תופס כל שגיאה, כולל באגים שלך, ומסתיר אותן. שמן את השגיאה שאתה מצפה לה.tryגדול מאוד. שמור רק את השורות המסוכנות בתוךו, כדי שתדע אילו שורות ה-exceptמגיב עליהן."w"כשבררת מחדל התכוונת ל-"a"."w"מנקה תוכן ישן תחילה.- שכחת
strip()ו-"\n". שורות שנקראות שומרות את קו החדש שלהן; שורות שנכתבות זקוקות לאחד.
except: ללא תנאי הוא הבחירה הבטוחה ביותר, כי היא מונעת מהתוכנית להיקרס לעולם.
רמת קושי 1/5 · 100 מטבעות + בונוס קטן בהשלמה הראשונה היום
היא גם בולעת את השגיאות שלך, כמו שם משתנה שכתוב לא נכון, כך שהן נכשלות בשקט. ציין את השגיאה הצפויה שאתה יכול להשיב עליה.
הבנתך מושלמת
with open(...)סוגר עבורך את הקובץ."r"קורא,"w"מנטרל וכותב,"a"מחבר; נקה שורות שנקראו, הוסף"\n"לשורות שכתבת.- יוצא מהכלל יש שם.
try … except Name:תופס את השגיאה הזו; שאר חסימתtryמושתקת. - תפס רק את השגיאות שאתה יכול לענות עליהן, תן לכל אחת מהן מענה ברירת מחדל, והשא שגיאות לא צפויות לקרוס כדי שתוכל לתקן אותן.