איך התחלנו לנהל שגיאות ב Rust (חלק ג' - anyhow)

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

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

anyhow::Result

כמו שבפוסט הקודם ראינו שאפשר להשתמש ב box dyn Error כערך החזרה של השגיאות שלנו וכך לאפשר פעפוע של כל שגיאה שמממשת את Error trait - הספרייה anyhow נותנת לנו type נוח יותר לשימוש ובשימוש בו אנחנו לא צריכים לציין את סוג השגיאה שלנו.


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

בשביל לפתור את הבעיה הזו כל מה שצריך לעשות זה לגרום לשגיאה שאליה anyhow::Result מתייחס להיות אותה שגיאה שהגדרנו. את זה נעשה באמצעות הגדרת alias ל type באופן הבא:


כאן בעצם הגדרנו טיפוס Result משלנו, שאיבר השגיאה בו הוא TomerCodeError ועכשיו נוכל להשתמש באותו בטיפוס שהגדרנו ולהנות מהטוב של שני העולמות.


טיפוס השגיאה שלנו יראה ככה כרגע (הניחו שנמצא בתוך מודול בשם tomercode_error):
(שימו לב שהוספתי שגיאה "כללית" שיודעת לקבל anyhow error באופן שקוף על מנת שכל שגיאה שמפועפעת מכל פונקציה תוכל להיות מומרת לשגיאה מהסוג שלנו).


Context

אחת היכולות הכי חשובות ביותר של הספרייה Anyhow (ושל כל ספריית ניהול שגיאות בה נשתמש) היא לקבל קונטקסט ומידע נוסף על השגיאה כשאנחנו נדרשים לקרוא את הפירוט שלה. באמצעות הפונקציה context בה נוכל להשתמש על טיפוס Result, נוכל לספר לקורא השגיאה בדיוק מה ה flow שגרם לשגיאה לקרות (ממש כמו stack trace, רק שבשביל לקבל stack trace אמיתי לרוב נצטרך לרוץ ב debug ולטעון סימובלים כדי להבין את השתלשלות האירועים. דבר שלפחות במקרה שלי - לא היה אפשרי לביצוע בפרודקשן).

לצורך הדוגמה נסתכל על קוד שמטרתו לפתוח קובץ ולעבד מידע מתוכו:


ללא שימוש ב context - אם היינו משתמשים באחת מהפונקציות הפנימיות בflow במספר מקומות (נניח שאנחנו יכולים לאבד את המידע מתוך קובץ וגם מקלט משתמש וכו') אז בהינתן כישלון בעיבוד הנתונים אנחנו לא נדע לאיזה תרחיש הכשלון שייך ומה גרם לו.

אך משום שסיפקנו context לכל קריאה אנחנו נראה במקרה של כשלון את כל הדרך אל הקריאה באופן הבא:


לצרכי debugging הייתי ממליץ גם לקרוא מעט על backtrace feature של anyhow שיכול לעזור.

סיכום

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

דיסקליימר קטן, יש הרבה מאוד גישות וספריות לניהול שגיאות בראסט. בפוסטים הללו שיתפתי את הדרך שלנו ואיך השימוש ב Result ובספריות thiserror ו anyhow עזרו לי באופן אישי.

תגובות

פוסטים פופולריים מהבלוג הזה

תכנות מונחה עצמים | Dependency Inversion Principle

מהם קבצי DLL ואיך להשתמש בהם?

מה ההבדל בין אוטומציה לפיתוח רגיל