איך התחלנו לנהל שגיאות ב 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 יכולה להצטרף לחגיגה ולעזור לנו לשפר את ניהול השגיאות שלנו צעד נוסף קדימה.

תגובות

  1. היי, אני כל כך מתרגשת לקבל בחזרה את נישואיי השבורים ואת בעלי אחרי שהוא עזב אותי ואת שני ילדינו למען אישה אחרת. אחרי 8 שנות נישואים, לבעלי ולי היה ויכוח אחד על השני עד שהוא סוף סוף עזב אותי ועבר לקליפורניה להיות עם אישה אחרת. הרגשתי שהחיים שלי נגמרו והילדים שלי חשבו שהם לעולם לא יראו את אביהם שוב. ניסיתי להיות חזקה רק בשביל הילדים, אבל לא יכולתי לשלוט בכאבים שעינו אותי, ליבי התמלא עצב וכאב, כי הייתי ממש מאוהבת בבעלי. אני חושבת עליו כל יום ולילה ותמיד רוצה שהוא יחזור אליי, הייתי ממש נסערת והייתי צריכה עזרה, אז חיפשתי עזרה באינטרנט ונתקלתי באתר שהציע שד"ר אפאטה יכול לעזור לי לחזור במהירות, אז הרגשתי שאני צריכה לנסות את זה. יצרתי איתו קשר והוא אמר לי מה לעשות ועשיתי את זה, ואז הוא עשה (כישוף אהבה) בשבילי. 48 שעות לאחר מכן, בעלי באמת התקשר אליי ואמר לי שהוא מתגעגע אליי ולילדים כל כך, כל כך מדהים!! אז הוא חזר באותו יום, עם הרבה אהבה ושמחה, והתנצל על הטעות שלו ועל הכאב שהוא גרם לי ולילדים. ואז, מאותו יום ואילך, הנישואים שלנו היו חזקים יותר מבעבר, הכל בזכות ד"ר אפאטה. הוא כל כך חזק והחלטתי לשתף את הסיפור שלי באינטרנט. ד"ר אפאטה הוא גלגל לחשים אמיתי ועוצמתי שאני תמיד אתפלל שיחיה זמן רב כדי לעזור לילדיי בעת צרה. אם אתם כאן וצריכים את האקס שלכם בחזרה או שבעלכם עבר לאישה אחרת, אל תבכו יותר, צרו קשר עם הקוסם העוצמתי הזה עכשיו. הנה פרטי הקשר שלו: שלחו לו אימייל לכתובת: drapata4@gmail.com, אתם יכולים גם ליצור איתו קשר דרך וואטסאפ או וייבר עם המספר הזה (+447307347648), תודה.

    השבמחק

הוסף רשומת תגובה

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

קודמתי לדרגת סיניור במיקרוסופט - מה למדתי בדרך

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

Rust Builder Pattern