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

خرابیاں: `if err != nil` پیٹرن

Go میں، غلطیاں قدریں ہیں، مستثنیات نہیں۔ ایسا فنکشن جو کر سکتا ہے۔ fail غلطی کو آخری قدر کے طور پر لوٹاتا ہے، اور کالر اسے چیک کرتا ہے۔ واضح طور پر یہ واضح، پیش قیاسی، جانچنا آسان ہے — قیمت ہے۔ تھوڑا سا زیادہ لفظی.

error انٹرفیس

error زبان میں بنایا گیا ایک چھوٹا انٹرفیس ہے:

Go
type error interface {
    Error() string
}

کوئی بھی قسم جو Error() string کو نافذ کرتی ہے ایک error ہے۔

بنیادی پیٹرن

Go
v, err := operazione()
if err != nil {
    // gestisci o propaga
    return err
}
// usa v

آپ اسے ہزاروں بار دیکھیں گے: یہ ہر ایک کے لیے محاوراتی کوڈ ہے۔ غلط کال. تکرار کے بارے میں مجرم محسوس نہ کریں - یہ ایک خصوصیت ہے، نہیں ایک بگ

عمارت کی خرابیاں: errors.New اور fmt.Errorf

Go
import (
    "errors"
    "fmt"
)

err1 := errors.New("file mancante")
err2 := fmt.Errorf("apertura %q fallita: permesso negato", path)

fmt.Errorf جب آپ پیغام میں متغیرات شامل کرنا چاہتے ہیں تو کامل ہے۔

%w کے ساتھ لپیٹنا

اصل کو کھونے کے بغیر سیاق و سباق کو شامل کرنے میں غلطی کا پرچار کرنے کے لیے:

Go
f, err := os.Open(path)
if err != nil {
    return fmt.Errorf("config: %w", err)
}

%w اصل غلطی کو "لپیٹ" دیتا ہے، بعد میں اس کے ساتھ بازیافت کیا جا سکتا ہے errors.Is (سینٹینلز کے لئے مساوات) یا errors.As (کنکریٹ قسم کے لئے):

Go
if errors.Is(err, os.ErrNotExist) {
    // file inesistente, gestione speciale
}

سینٹینل کی غلطیاں

یہ وہ خرابیاں ہیں جو متغیر کے طور پر برآمد کی جاتی ہیں، جو errors.Is کے ساتھ موازنہ کے لیے استعمال ہوتی ہیں:

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

func find(id int) (Item, error) {
    // ...
    return Item{}, ErrNotFound
}

// chiamante:
if errors.Is(err, ErrNotFound) { ... }

panic اور recover (پیش منظر)

panic Go میں موجود ہے لیکن ناقابل بازیافت خرابیوں کے لیے محفوظ ہے (جیسے کیڑے، خلاف ورزی شدہ invariants)، عام کنٹرول کے بہاؤ کے لیے نہیں۔ ہم مزید گہرائی میں جائیں گے۔ defer/recover کے ساتھ فنکشنز ماڈیول۔ ابھی کے لیے: اسے استعمال نہ کریں جگہ پر if err != nil پیٹرن کا۔

اسے آزمائیں

ورزش#go.m2.l5.e1
کوششیں: 0لوڈ ہو رہا ہے…

strconv.Atoi سے غلطی کو ہینڈل کریں: اگر err != nil، اسے پرنٹ کریں اور واپس کریں؛ دوسری صورت میں پرنٹ n.

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

کینونیکل پیٹرن: `err != nil` کو چیک کریں، log/return، پھر `n` استعمال کریں۔

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

ورزش#go.m2.l5.e2
کوششیں: 0لوڈ ہو رہا ہے…

SafeDiv کو لاگو کریں: اگر b == 0 لوٹتا ہے 0 اور ایک errors۔New('divisione per zero')؛ دوسری صورت میں a/b اور صفر۔

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

رن ٹائم گھبراہٹ سے بچنے کے لیے تقسیم سے پہلے `b == 0` کو چیک کریں۔

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

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

Go میں غلطی کو ہینڈل کرنے کے لیے کون سا محاورہ نمونہ ہے؟

Go
v, err := f()
// poi?
جواب کے اختیارات

Recap

  • error ایک طریقہ کے ساتھ ایک انٹرفیس ہے Error() string۔
  • کینونیکل پیٹرن: v, err := f(); if err != nil { return err }۔
  • errors.New(msg) یا fmt.Errorf("ctx: %w", err) کے ساتھ غلطیاں بنائیں۔
  • ریپنگ کے لیے %w اور زنجیر کا معائنہ کرنے کے لیے errors.Is / errors.As استعمال کریں۔
  • panic صرف ناقابل بازیافت غلطیوں کے لیے، عام کنٹرول کے بہاؤ کے لیے نہیں۔