ماڈیول اسباق (5/5)
غلطی کا انٹرفیس
Go میں error کلیدی لفظ نہیں ہے: یہ ایک بلٹ ان انٹرفیس ہے
واحد طریقہ.
type error interface {
Error() string
}کوئی بھی چیز جس میں Error() string ہے وہ ایک error ہے۔ کے ساتھ مل کر
فنکشنز سے (T, error) واپس کرنے کا کنونشن، یہ ہے۔
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 کوششوں کے بعد حل دستیاب ہے۔
ایرر استعمال کریں
اشارہ دکھائیں۔
`غلطیاں۔ کیا(غلطی، ہدف)` ریپنگ چینز کے ساتھ بھی مضبوط ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
غلطی کو لاگو کرنے کے طریقہ کار کا صحیح دستخط کیا ہے؟
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استعمال کریں۔