עטיפת שגיאות באמצעות `%w`
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 39 מתוך 68.
כאשר מתרחשות שגיאות באפליקציה שלך, לעיתים קרובות הן זקוקות להקשר נוסף כשהן עוברות דרך שכבות שונות בקוד שלך. Go מספקת מנגנון רב עוצמה לכך באמצעות עטיפת שגיאות בעזרת פועל הפורמט %w עם fmt.Errorf.
עטיפת שגיאות מאפשרת להוסיף מידע הקשרי לשגיאה קיימת, תוך שמירה על השגיאה המקורית מתחתיה. כך נוצרת שרשרת שגיאות ששומרת את ההיסטוריה המלאה של מה שהשתבש:
originalErr := errors.New("file not found")
wrappedErr := fmt.Errorf("failed to load config: %w", originalErr)הפועל %w מיוחד — הוא אומר ל־fmt.Errorf לעטוף את השגיאה במקום רק להמיר אותה למחרוזת. כך נשמרת השגיאה המקורית, ואפשר לבדוק אותה מאוחר יותר באמצעות פונקציות כמו errors.Is ו־errors.As.
התבנית הזו שימושית במיוחד ביישומים גדולים יותר, שבהם שגיאה עשויה לעבור דרך כמה פונקציות, שכל אחת מהן מוסיפה הקשר משלה. לדוגמה, שגיאת חיבור למסד נתונים עשויה להיעטף ב־"failed to connect to database", ואז להיעטף שוב ב־"unable to start server", וכך ליצור תיעוד ברור של מה קרה והיכן.
אתגר
קלבנו מערכת לעיבוד קבצים שעוטפת שגיאות במידע הקשרי כשהן עוברות בין שכבות שונות של היישום שלכם. האתגר הזה מדגים כיצד להשתמש בפועל הפורמט %w עם fmt.Errorf כדי ליצור שרשראות שגיאות שמשמרות את השגיאה המקורית ומוסיפות הקשר משמעותי.
תקבלו שתי כניסות:
- מחרוזת שמכילה פרטים על פעולת קובץ בפורמט
"filename,operation,status"(לדוגמה:"config.json,read,permission_denied") - מחרוזת שמכילה הקשר מערכת בפורמט
"service_name,component"(לדוגמה:"UserService,ConfigLoader")
המשימה שלכם היא:
- לנתח את הקלט הראשון באמצעות פיצול לפי פסיקים כדי לקבל את שם הקובץ, הפעולה והסטטוס
- לנתח את הקלט השני באמצעות פיצול לפי פסיקים כדי לקבל את שם השירות והרכיב
- ליצור שגיאה מקורית על סמך הסטטוס באמצעות
errors.New():- אם הסטטוס הוא
"permission_denied":"permission denied" - אם הסטטוס הוא
"not_found":"file not found" - אם הסטטוס הוא
"corrupted":"file corrupted" - עבור כל סטטוס אחר:
"unknown error"
- אם הסטטוס הוא
- ליצור שגיאה עטופה ברמת הקובץ באמצעות
fmt.Errorfעם%w:"failed to [operation] file [filename]: %w" - ליצור שגיאה עטופה ברמת הרכיב:
"[component] error: %w" - ליצור שגיאה עטופה ברמת השירות:
"[service_name] operation failed: %w" - להציג את שרשרת השגיאות באמצעות הדפסת כל רמה:
"Original error: [original_error_message]""File level: [file_level_error_message]""Component level: [component_level_error_message]""Service level: [service_level_error_message]"
- להציג סיכום של שרשרת השגיאות:
"Error Chain Summary:""File: [filename]""Operation: [operation]""Component: [component]""Service: [service_name]""Root cause: [original_error_message]"
השתמשו בחבילה strings כדי לפצל את מחרוזות הקלט לפי פסיקים, בחבילה errors כדי ליצור את השגיאה המקורית, ובחבילה fmt כדי ליצור שגיאות עטופות. האתגר הזה מדגים כיצד עטיפת שגיאות באמצעות %w יוצרת מסלול ברור של הקשר כשהשגיאות עוברות בין שכבות שונות של היישום שלכם, וכך הופכת את ניפוי השגיאות ליעיל הרבה יותר.
נסו בעצמכם
package main
import (
"errors"
"fmt"
"strings"
)
func main() {
// קראו את הקלט
var fileDetails string
var systemContext string
fmt.Scanln(&fileDetails)
fmt.Scanln(&systemContext)
// נתחו את נתוני הקלט
fileInfo := strings.Split(fileDetails, ",")
filename := fileInfo[0]
operation := fileInfo[1]
status := fileInfo[2]
contextInfo := strings.Split(systemContext, ",")
serviceName := contextInfo[0]
component := contextInfo[1]
// TODO: כתבו את הקוד שלכם למטה
// צרו שגיאה מקורית על סמך status
// צרו שגיאה עטופה ברמת הקובץ
// צרו שגיאה עטופה ברמת הרכיב
// צרו שגיאה עטופה ברמת השירות
// הדפיסו כל רמת שגיאה וסיכום
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה7טיפול בשגיאות לעומק
סוגי שגיאות מותאמים אישיתעטיפת שגיאות באמצעות `%w`חילוץ שגיאות באמצעות `errors.Is`חילוץ שגיאות באמצעות `errors.As`הבנת `panic`שימוש ב־`recover`סיכום — חלוקה בטוחה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין