איך התחלנו לנהל שגיאות ב Rust (חלק ג' - anyhow)
אם הגעת לכאן במקרה אני ממליץ להתחיל בפוסט הראשון והשני על מנת לקבל רקע.
החלק השלישי במסע שלנו לניהול שגיאות היה ההטמעה של anyhow. הספרייה מספקת מספר פיצ'רים נחמדים מאוד שמקלים על הפיתוח ומייפים את הקוד, מייעלים את ניהול השגיאות, ואפילו עוזרים לאחר השגיאה בניתוח שלה.
anyhow::Result
כמו שבפוסט הקודם ראינו שאפשר להשתמש ב box dyn Error כערך החזרה של השגיאות שלנו וכך לאפשר פעפוע של כל שגיאה שמממשת את Error trait - הספרייה anyhow נותנת לנו type נוח יותר לשימוש ובשימוש בו אנחנו לא צריכים לציין את סוג השגיאה שלנו.
אבל יש בעיה קטנה, אם נשתמש ב anyhow באופן הזה אמנם נרוויח את היכולת לבצע פעפוע של כל שגיאה מבלי להוסיף אותה ל TomerCodeError type שהגדרנו בפוסט הקודם, אבל אנחנו מאבדים את השימוש בשגיאה המותאמת אישית שהגדרנו ובכל יכולות ה formatting שהגדרנו לה.
בשביל לפתור את הבעיה הזו כל מה שצריך לעשות זה לגרום לשגיאה שאליה anyhow::Result מתייחס להיות אותה שגיאה שהגדרנו. את זה נעשה באמצעות הגדרת alias ל type באופן הבא:
כאן בעצם הגדרנו טיפוס Result משלנו, שאיבר השגיאה בו הוא TomerCodeError ועכשיו נוכל להשתמש באותו בטיפוס שהגדרנו ולהנות מהטוב של שני העולמות.
(שימו לב שהוספתי שגיאה "כללית" שיודעת לקבל anyhow error באופן שקוף על מנת שכל שגיאה שמפועפעת מכל פונקציה תוכל להיות מומרת לשגיאה מהסוג שלנו).
Context
אחת היכולות הכי חשובות ביותר של הספרייה Anyhow (ושל כל ספריית ניהול שגיאות בה נשתמש) היא לקבל קונטקסט ומידע נוסף על השגיאה כשאנחנו נדרשים לקרוא את הפירוט שלה. באמצעות הפונקציה context בה נוכל להשתמש על טיפוס Result, נוכל לספר לקורא השגיאה בדיוק מה ה flow שגרם לשגיאה לקרות (ממש כמו stack trace, רק שבשביל לקבל stack trace אמיתי לרוב נצטרך לרוץ ב debug ולטעון סימובלים כדי להבין את השתלשלות האירועים. דבר שלפחות במקרה שלי - לא היה אפשרי לביצוע בפרודקשן).
לצורך הדוגמה נסתכל על קוד שמטרתו לפתוח קובץ ולעבד מידע מתוכו:
ללא שימוש ב context - אם היינו משתמשים באחת מהפונקציות הפנימיות בflow במספר מקומות (נניח שאנחנו יכולים לאבד את המידע מתוך קובץ וגם מקלט משתמש וכו') אז בהינתן כישלון בעיבוד הנתונים אנחנו לא נדע לאיזה תרחיש הכשלון שייך ומה גרם לו.
אך משום שסיפקנו context לכל קריאה אנחנו נראה במקרה של כשלון את כל הדרך אל הקריאה באופן הבא:
בפוסט השלישי והאחרון דיברנו על הספרייה anyhow שאמורה להשלים לנו את רוב מה שחסר בשביל שניהול השגיאות בפרויקט שלנו יהפכו לפשוטות יותר, יפות יותר וקלות יותר לתחזוקה.
דיסקליימר קטן, יש הרבה מאוד גישות וספריות לניהול שגיאות בראסט. בפוסטים הללו שיתפתי את הדרך שלנו ואיך השימוש ב Result ובספריות thiserror ו anyhow עזרו לי באופן אישי.
היי, אני כל כך מתרגשת לקבל בחזרה את נישואיי השבורים ואת בעלי אחרי שהוא עזב אותי ואת שני ילדינו למען אישה אחרת. אחרי 8 שנות נישואים, לבעלי ולי היה ויכוח אחד על השני עד שהוא סוף סוף עזב אותי ועבר לקליפורניה להיות עם אישה אחרת. הרגשתי שהחיים שלי נגמרו והילדים שלי חשבו שהם לעולם לא יראו את אביהם שוב. ניסיתי להיות חזקה רק בשביל הילדים, אבל לא יכולתי לשלוט בכאבים שעינו אותי, ליבי התמלא עצב וכאב, כי הייתי ממש מאוהבת בבעלי. אני חושבת עליו כל יום ולילה ותמיד רוצה שהוא יחזור אליי, הייתי ממש נסערת והייתי צריכה עזרה, אז חיפשתי עזרה באינטרנט ונתקלתי באתר שהציע שד"ר אפאטה יכול לעזור לי לחזור במהירות, אז הרגשתי שאני צריכה לנסות את זה. יצרתי איתו קשר והוא אמר לי מה לעשות ועשיתי את זה, ואז הוא עשה (כישוף אהבה) בשבילי. 48 שעות לאחר מכן, בעלי באמת התקשר אליי ואמר לי שהוא מתגעגע אליי ולילדים כל כך, כל כך מדהים!! אז הוא חזר באותו יום, עם הרבה אהבה ושמחה, והתנצל על הטעות שלו ועל הכאב שהוא גרם לי ולילדים. ואז, מאותו יום ואילך, הנישואים שלנו היו חזקים יותר מבעבר, הכל בזכות ד"ר אפאטה. הוא כל כך חזק והחלטתי לשתף את הסיפור שלי באינטרנט. ד"ר אפאטה הוא גלגל לחשים אמיתי ועוצמתי שאני תמיד אתפלל שיחיה זמן רב כדי לעזור לילדיי בעת צרה. אם אתם כאן וצריכים את האקס שלכם בחזרה או שבעלכם עבר לאישה אחרת, אל תבכו יותר, צרו קשר עם הקוסם העוצמתי הזה עכשיו. הנה פרטי הקשר שלו: שלחו לו אימייל לכתובת: drapata4@gmail.com, אתם יכולים גם ליצור איתו קשר דרך וואטסאפ או וייבר עם המספר הזה (+447307347648), תודה.
השבמחק