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


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

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

שימוש ב thiserror

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

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

thiserror, בין השאר מספקת לנו את המאקרו הפרוצדורלי Error שאפשר להשתמש בו מעל טיפוס השגיאה אותו נרצה לייצר. כאשר נשתמש ב derive Error הטייפ שהגדרנו יממש באופן אוטומטי את ה Error trait ויחסוך לנו את אותו ה boilerplate שדיברנו עליו מקודם.

בדוגמה אפשר לראות תוספת של כמה שורות קוד שבאמצעותה הגדרנו טיפוס שגיאה משלנו עם derive(Error) ולאחר מכן את error שעוזר לנו להגדיר formatting להודעת השגיאה וגם את from שנותן לנו את היכולת להמיר שגיאה מסוג מסוים לשגיאה מהסוג שהגדרנו.

איך זה יעזור לנו?

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

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


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

אבל הדרך היותר אלגטנית לעשות זאת היא פשוט להוסיף ל enum של TomerCodeError שיצרנו קודם שדה נוסף שמממש from LoggingError.

וכעת אפשר לשנות את חתימת הפונקציה שקוראת מ registry כך שתדע להחזיר TomerCodeError

סיכום

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

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

תגובות

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

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

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

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