שגיאות והטיפול בהן
כמו שפות תכנות מונחות עצמים אחרות, גם בפיתון קיים מנגנון
לטיפול בזריקת שגיאות. הדרך לזריקת שגיאה היא השימוש בפקודה
raise ומנגנון בדיקת השגיאות הוא באמצעות בלוק
של try..except.
זריקת שגיאות הוא מנגנון נפוץ מאוד בפיתון. כמעט כל מודול
בספרית המודולים הסטנדרטית משתמש בו, ושפת פיתון עצמה זורקת שגיאות
במקרים רבים ושונים, בחלקם אף נתקלנו בדוגמאות שבפרקים
הקודמים.
למשל, גישה למפתח לא-קיים במילון יגרום לזריקת שגיאת
KeyError, חיפוש ערך שאינו קיים ברשימה יגרום
לזריקת שגיאת ValueError, פנייה למשתנה
שאינו קיים במערכת יגרום לזריקת שגיאת NameError, וכן הלאה.
כאשר אנו כותבים קוד בתוך הממשק האינטראקטיבי של פיתון
(IDLE) וגורמים לזריקת שגיאה, היא מודפסת על
המסך בצבע אדום. מצב זה נקרא "שגיאה לא מטופלת" כאשר השגיאה נזרקה, לא
היה קטע קוד שזיהה את השגיאה וטיפל בה באופן מיוחד, ולכן היא פעפעה
מעלה עד להתנהגות הרגילה של פיתון במקרה זה, שהיא להדפיס את השגיאה
(ביחד עם עוד מידע לצרכי אבחון) ולעצור את ביצוע התכנית. אם התנהגות
כזו קורית בתוך הממשק האינטראקטיבי, זה לא כל כך נורא, אולם אם הדבר
קורה באמצע תכנית שמשתמש מריץ, התכנית פשוט
תקרוס...
אם כן. כיצד מונעים משגיאה שנזרקת לעצור את התכנית כולה? לשם
כך עלינו "לטפל" בשגיאה. לעתים שגיאות נוצרות עקב טעות בקוד (גישה
למשתנה לא קיים) אך לרוב הן תוצר של תהליך שאנו יכולים לצפות מראש שהוא
עלול להיכשל – אם אנו פותחים קובץ, יכול להיות שהוא לא יהיה קיים. אם
אנו מתחברים לשרת, יכול להיות שהחיבור ייכשל. הדרך להתכונן מראש לטיפול
בשגיאות כאלה היא בעזרת בלוקים של try..except .
>>> fsock = open("/notthere", "r")
Traceback
(innermost last): File
"<interactive input>", line 1, in ? IOError:
[Errno 2] No such file or directory: '/notthere' >>>
try: ... fsock =
open("/notthere") ... except
IOError: ... print
"The file does not exist, exiting gracefully" ... print
"This line will always print" The file does
not exist, exiting gracefully This line
will always print
העבירו את הסמן מעל השורות
המסומנות לקבלת הסברים
הפונקציה המובנית open משמשת לפתיחת
קבצים. אם הקובץ אינו קיים, היא גורמת לזריקת שגיאת IOError, שגורמת להדפסת השגיאה (ומידע נוסף) ולעצירת
התכנית.
בשורה זו אנו מנסים לפתוח את אותו קובץ לא קיים, אך הפעם
בתוך בלוק של try..except
כאן אנו מחכים לשגיאת IOError שהפונקציה עלולה לזרוק. לאחר זריקת השגיאה, היא
נתפסת בשורה זו, והקוד שבתוך הבלוק מתבצע – ההדפסה (יפה יותר) שהקובץ
אינו קיים.
מכיוון שהזריקה טופלה, ביצוע התכנית ממשיך כרגיל, וההודעה
שבסיום התכנית מודפסת אף היא.
למרות שזריקת שגיאות הוא מנגנון קשיח ולא סבלני לשגיאות (שגורם
לעצירת התכנית על כל שגיאה שאינה מטופלת) הוא מבטיח שהתכנית לא תמשיך
להתבצע על מידע חסר, לא שלם או זבלי.
|