דילוג לתוכן המרכזי
מודול 6 · שיעור 5 מתוך 530/50 בקורס~14 min
שיעורי מודול (5/5)

ממשק השגיאה

error ב-Go היא לא מילת מפתח: זה ממשק מובנה עם שיטה אחת.

Go
type error interface {
    Error() string
}

כל דבר שיש לו Error() string הוא error. בשילוב עם ה מוסכמה של החזרת (T, error) מפונקציות, זה foundation of error handling in Go.

שגיאות זקיף

Go
import "errors"

var ErrNotFound = errors.New("non trovato")

func find(key string) (string, error) {
    // ...
    return "", ErrNotFound
}

זקיף הוא ערך error מיוצא שהמתקשר יכול השוו מול כדי לזהות מקרה שגיאה ספציפי.

שגיאות מותאמות אישית (עם נתונים)

כדי לשאת הקשר (למשל המפתח החסר) אתה מגדיר סוג:

Go
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:

Go
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

Go
if err := find("k"); err != nil {
    return fmt.Errorf("operazione X: %w", err)
}

%w (NOT %s או %v) יוצר שגיאה חדשה שעוטפת את מקורי, שמירה על ניווט בשרשרת על ידי errors.Is/As.

דפוס טיפול

Go
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.

נסה את זה

פעילות גופנית#go.m6.l5.e1
ניסיונות: 0טוען...

יישם מחרוזת Error() ב-*ErrNotFound כך שהיא תחזיר את 'non trovato: <Key>'.

טוען עורך...
הצג רמז

`fmt.Println(err)` קורא אוטומטית לשיטת Error() במבנה שלך.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#go.m6.l5.e2
ניסיונות: 0טוען...

השתמש ב- errors.Is כדי לבדוק אם err שווה לזקיף ErrVuoto.

טוען עורך...
הצג רמז

`errors.Is(err, target)` חזק גם עם עטיפת שרשראות.

הפתרון זמין לאחר 3 ניסיונות

Quiz#go.m6.l5.e3
מוכן

מהי החתימה המדויקת של השיטה ליישום שגיאה?

Go
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.