שגיאה, כישלון וחריגה (חלק ראשון)

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

אנסה לעשות מעט סדר בנושא לפחות לפי צורה שאני מקבל אותה:

  • שגיאה – היא מצב בו התוכנה/הקוד אינו מממש דבר מה שכן מתבקש ממנו לעשות.
  • כישלון – הוא חוסר היכולת לבצע את המשימה שהתוכנה עצמה אמורה לבצע
  • חריגה – היא מצב בו בוצע משהו בלתי צפוי בריצת התוכנה.

כלומר שגיאה שלא מטפלים בה מובילה לכישלון, וכישלון שלא מטופל מוביל לחריגה. זה ממש בגדול ההסבר שיש לBertrand Meyer עבור המצב הזה.

אם אנחנו מצפים לקבל 4 ספרות ואחד מהתווים שמתקבל הוא תו "A" למשל, אז הקוד שלנו צריך לדעת לטפל במצב הזה. הרמת חריגה (exception) מבחינת קוד, אינה מתאימה במקרה הזה, היות ואנחנו בשלב של בדיקת הקלט של המשתמש. לכן היינו מצפים שתהיה למשל פונקציה אשר תבדוק האם התו הוא ספרה, ואם לא היא תחזיר ערך שלילי ואם היא ספרה אז תחזיר ערך חיובי.

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

אז מתי כן יש להשתמש בחריגה ? ובכן נגיד ואנחנו רוצים לפתוח קובץ לקריאה. נבדוק האם הקובץ קיים, נבדוק האם יש לנו הרשאות קריאה לקובץ ונתחיל לקרוא אותו, אחרי שנוודא גם כי הגודל שלו גדול מ0. אבל אם בזמן הניסיון קריאה אנחנו מגלים שאנחנו לא מצליחים לקרוא את התוכן – כלומר קרה משהו לא תקין, אז נוכל להרים חריגה על כך שהקובץ לא באמת מאופשר לקריאה (במערכות מסויימות הוא אולי נעול וגם את זה יש לבדוק לפני). כלומר למרות שעשינו את כל מה שניתן לוודא את הפעולה, היא עדיין לא הצליחה וזה חורג ממה שיכולנו לשלוט בו כבר.

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

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s