בעיות בהתנהגות החריגות (חלק רביעי)

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

ובכן יש מספר דברים שצריך להבין על חריגות ברובי:

  1. יצירת rescue "גלובלי", כלומר שנראה כי נבנה לתפוס כל חריגה אפשרית, ובכן הוא לא יתפוס כל חריגה אפשרית. כך שחריגות כמו NoMemoryError למשל, לא יתפסו ב rescue כללי.
  2. יש דרך ברובי "להעלים" חלק מהחריגות. כלומר למרות שחריגה מסויימת "הורמה", היא לא בהכרח "תעלה" לנו בשביל לטפל בה.
  3. התמודדות לא נכונה עם חריגה, יכולה להחביא את הבעיה האמיתית, ולהציג במקום בעיה אחרת לגמרי, ובכך איבדנו את הבעיה האמיתית שהרימה את החריגה.
  4. יש חריגות אשר למרות שאנחנו יכולים לתפוס אותם, אנחנו לא יכולים להציל את התוכנה מהן. יותר מזה, יש חריגות אשר יגרמו לתוכנית שלנו פשוט "למות" מייד בלי יכולת לטפל בשום דבר באמצע. חריגות כאלו מוגדרות כחריגות fatal, והן יתרחשו בד"כ כאשר ה core של רובי או משהו שקשור אליו אינו יכול להתמודד עם בעיה.
  5. יש מצבים בהם נרצה לחזור שוב על פעולות מסויימות (ראו את הפוסט שלי על "לחזור שנית" ברובי), וזה דורש מאיתנו החלטות על איך להתמודד עם הגישה הזו גם כן, אחרת הסעיף השני והשלישי יכנסו לתוקף (או אולי בעיה אחרת). גם באג בהתמודדות עם פעולות כמו redo ו retry יכולות לגרום לבעיות אחרות לגמרי, כדוגמת לולאה אין סופית.
  6. כאשר יש חריגה בThread (ארתיום, אני עונה על השאלה שלך), אז אם לא תפסנו אותה שם, היא תגיע לאב שהריץ את הThread בגלל שהThread "ימות" לנו, ואם האב לא יטפל בה, אז החריגה תגיע לאבא שלו וכו' עד שהיא תטופל או תגרום לתוכנה "למות".

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

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

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

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s