איך התחלנו לנהל שגיאות ב 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
תגובות
הוסף רשומת תגובה