मॉड्यूल पाठ (5/5)
त्रुटि इंटरफ़ेस
गो में error कोई कीवर्ड नहीं है: यह एक अंतर्निहित इंटरफ़ेस है
एकल विधि.
type error interface {
Error() string
}कोई भी चीज़ जिसमें Error() string है वह error है। के साथ संयुक्त
फ़ंक्शंस से (T, error) लौटाने की परंपरा, यह है
गो में त्रुटि प्रबंधन की नींव।
प्रहरी त्रुटियाँ
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}
}त्रुटियाँ.है और त्रुटियाँ.जैसा (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 (%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के साथ भेदभाव करें।
इसे अजमाएं
*ErrNotFound पर Error() स्ट्रिंग लागू करें ताकि यह 'नॉन ट्रोवाटो: <Key>' लौटाए।
संकेत दिखाएँ
`fmt.Println(err)` स्वचालित रूप से आपकी संरचना पर Error() विधि को कॉल करता है।
3 प्रयासों के बाद समाधान उपलब्ध है
यह जांचने के लिए error.Is का उपयोग करें कि क्या err प्रहरी errVuoto के बराबर है।
संकेत दिखाएँ
`errors.Is(err, target)` रैपिंग चेन के साथ भी मजबूत है।
3 प्रयासों के बाद समाधान उपलब्ध है
त्रुटि लागू करने की विधि का सटीक हस्ताक्षर क्या है?
func (e *MyErr) ??? {}संक्षिप्त
error = interface { Error() string }, अंतर्निर्मित।- बिना संदर्भ के ज्ञात मामलों के लिए
errors.New("...")वाले प्रहरी। - संदर्भ ले जाने के लिए फ़ील्ड के साथ कस्टम त्रुटि प्रकार।
errors.Is(err, target): रैपिंग से तुलना मजबूत।errors.As(err, &target): कंक्रीट प्रकार का निष्कर्षण।fmt.Errorf("...: %w", err): रैपिंग जो श्रृंखला को सुरक्षित रखती है।- कभी भी
%v/%sको लपेटें नहीं: हमेशा%wका उपयोग करें।