ماڈیول اسباق (5/5)
خرابیاں: `if err != nil` پیٹرن
Go میں، غلطیاں قدریں ہیں، مستثنیات نہیں۔ ایسا فنکشن جو کر سکتا ہے۔ fail غلطی کو آخری قدر کے طور پر لوٹاتا ہے، اور کالر اسے چیک کرتا ہے۔ واضح طور پر یہ واضح، پیش قیاسی، جانچنا آسان ہے — قیمت ہے۔ تھوڑا سا زیادہ لفظی.
error انٹرفیس
error زبان میں بنایا گیا ایک چھوٹا انٹرفیس ہے:
type error interface {
Error() string
}کوئی بھی قسم جو Error() string کو نافذ کرتی ہے ایک error ہے۔
بنیادی پیٹرن
v, err := operazione()
if err != nil {
// gestisci o propaga
return err
}
// usa vآپ اسے ہزاروں بار دیکھیں گے: یہ ہر ایک کے لیے محاوراتی کوڈ ہے۔ غلط کال. تکرار کے بارے میں مجرم محسوس نہ کریں - یہ ایک خصوصیت ہے، نہیں ایک بگ
عمارت کی خرابیاں: errors.New اور fmt.Errorf
import (
"errors"
"fmt"
)
err1 := errors.New("file mancante")
err2 := fmt.Errorf("apertura %q fallita: permesso negato", path)fmt.Errorf جب آپ پیغام میں متغیرات شامل کرنا چاہتے ہیں تو کامل ہے۔
%w کے ساتھ لپیٹنا
اصل کو کھونے کے بغیر سیاق و سباق کو شامل کرنے میں غلطی کا پرچار کرنے کے لیے:
f, err := os.Open(path)
if err != nil {
return fmt.Errorf("config: %w", err)
}%w اصل غلطی کو "لپیٹ" دیتا ہے، بعد میں اس کے ساتھ بازیافت کیا جا سکتا ہے
errors.Is (سینٹینلز کے لئے مساوات) یا errors.As (کنکریٹ قسم کے لئے):
if errors.Is(err, os.ErrNotExist) {
// file inesistente, gestione speciale
}سینٹینل کی غلطیاں
یہ وہ خرابیاں ہیں جو متغیر کے طور پر برآمد کی جاتی ہیں، جو errors.Is کے ساتھ موازنہ کے لیے استعمال ہوتی ہیں:
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 پیٹرن کا۔
اسے آزمائیں
strconv.Atoi سے غلطی کو ہینڈل کریں: اگر err != nil، اسے پرنٹ کریں اور واپس کریں؛ دوسری صورت میں پرنٹ n.
اشارہ دکھائیں۔
کینونیکل پیٹرن: `err != nil` کو چیک کریں، log/return، پھر `n` استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
SafeDiv کو لاگو کریں: اگر b == 0 لوٹتا ہے 0 اور ایک errors۔New('divisione per zero')؛ دوسری صورت میں a/b اور صفر۔
اشارہ دکھائیں۔
رن ٹائم گھبراہٹ سے بچنے کے لیے تقسیم سے پہلے `b == 0` کو چیک کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
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صرف ناقابل بازیافت غلطیوں کے لیے، عام کنٹرول کے بہاؤ کے لیے نہیں۔