שיעורי מודול (5/5)
ממשק השגיאה
error ב-Go היא לא מילת מפתח: זה ממשק מובנה עם
שיטה אחת.
type error interface {
Error() string
}כל דבר שיש לו Error() string הוא error. בשילוב עם ה
מוסכמה של החזרת (T, error) מפונקציות, זה
foundation of error handling in Go.
שגיאות זקיף
import "errors"
var ErrNotFound = errors.New("non trovato")
func find(key string) (string, error) {
// ...
return "", ErrNotFound
}זקיף הוא ערך error מיוצא שהמתקשר יכול
השוו מול כדי לזהות מקרה שגיאה ספציפי.
שגיאות מותאמות אישית (עם נתונים)
כדי לשאת הקשר (למשל המפתח החסר) אתה מגדיר סוג:
type ErrNotFound struct {
Key string
}
func (e *ErrNotFound) Error() string {
return "non trovato: " + e.Key
}
func find(key string) (string, error) {
return "", &ErrNotFound{Key: key}
}errors.Is and errors.As (Go 1.13+)
השוואה עם == עובדת רק עבור זקיפים "טהורים". להיות חסון
נגד שגיאות עטופות, השתמש בחבילת errors:
import "errors"
if errors.Is(err, ErrNotFound) {
// err IS ErrNotFound (even if wrapped)
}
var nfe *ErrNotFound
if errors.As(err, &nfe) {
// err IS (or wraps) an *ErrNotFound; nfe points to the concrete value
fmt.Println("chiave mancante:", nfe.Key)
}errors.Is(err, target): נכון אם המטרה נמצאת אי שם בשרשרת העיטוף.errors.As(err, &target): מקצה למיקוד השגיאה הראשונה בשרשרת מסוגה.
גלישה עם %w
if err := find("k"); err != nil {
return fmt.Errorf("operazione X: %w", err)
}%w (NOT %s או %v) יוצר שגיאה חדשה שעוטפת את
מקורי, שמירה על ניווט בשרשרת על ידי errors.Is/As.
דפוס טיפול
v, err := op()
if err != nil {
return fmt.Errorf("op fallita per %q: %w", id, err)
}ניבים:
- סמן את
err != nilמיד, אין "שביל שמח מוקדם". - הוסף הקשר בכל רמה עם
fmt.Errorf("... : %w", err). - "במעלה הזרם" (ליד ראשי / מטפל), הבחנה עם
errors.Is/As.
נסה את זה
יישם מחרוזת Error() ב-*ErrNotFound כך שהיא תחזיר את 'non trovato: <Key>'.
הצג רמז
`fmt.Println(err)` קורא אוטומטית לשיטת Error() במבנה שלך.
הפתרון זמין לאחר 3 ניסיונות
השתמש ב- errors.Is כדי לבדוק אם err שווה לזקיף ErrVuoto.
הצג רמז
`errors.Is(err, target)` חזק גם עם עטיפת שרשראות.
הפתרון זמין לאחר 3 ניסיונות
מהי החתימה המדויקת של השיטה ליישום שגיאה?
func (e *MyErr) ??? {}לְסַכֵּם
error = interface { Error() string }, built-in.- זקיפים עם
errors.New("...")למקרים ידועים ללא הקשר. - סוגי שגיאות מותאמים אישית עם שדות לשאת הקשר.
errors.Is(err, target): השוואה חזקה לעטיפה.errors.As(err, &target): מיצוי מסוג בטון.fmt.Errorf("...: %w", err): עטיפה ששומרת על השרשרת.- לעולם אל
%v/%sלעטוף: השתמש תמיד ב-%w.