مرکزی مواد پر جائیں
ماڈیول 6 · سبق 5 از 5کورس میں 30/50~14 min
ماڈیول اسباق (5/5)

غلطی کا انٹرفیس

Go میں error کلیدی لفظ نہیں ہے: یہ ایک بلٹ ان انٹرفیس ہے واحد طریقہ.

Go
type error interface {
    Error() string
}

کوئی بھی چیز جس میں Error() string ہے وہ ایک error ہے۔ کے ساتھ مل کر فنکشنز سے (T, error) واپس کرنے کا کنونشن، یہ ہے۔ 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لوڈ ہو رہا ہے…

ایرر استعمال کریں

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

`غلطیاں۔ کیا(غلطی، ہدف)` ریپنگ چینز کے ساتھ بھی مضبوط ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔

Quiz#go.m6.l5.e3
تیار

غلطی کو لاگو کرنے کے طریقہ کار کا صحیح دستخط کیا ہے؟

Go
func (e *MyErr) ??? {}
جواب کے اختیارات

Recap

  • error = interface { Error() string }، بلٹ ان۔
  • بغیر سیاق و سباق کے معلوم مقدمات کے لیے errors.New("...") کے ساتھ سینٹینلز۔
  • سیاق و سباق کو لے جانے کے لیے فیلڈز کے ساتھ حسب ضرورت غلطی کی اقسام۔
  • errors.Is(err, target): ریپنگ سے موازنہ مضبوط۔
  • errors.As(err, &target): کنکریٹ کی قسم کو نکالنا۔
  • fmt.Errorf("...: %w", err): لپیٹنا جو سلسلہ کو محفوظ رکھتا ہے۔
  • کبھی بھی %v / %s کو لپیٹنے کے لئے: ہمیشہ %w استعمال کریں۔