मुख्य सामग्री पर जाएं
मॉड्यूल 2 · पाठ 5 का 5पाठ्यक्रम में 10/50~12 min
मॉड्यूल पाठ (5/5)

त्रुटियाँ: `यदि ग़लती !=शून्य` पैटर्न

गो में, त्रुटियाँ मान हैं, अपवाद नहीं। एक फ़ंक्शन जो कर सकता है विफल त्रुटि को अंतिम मान के रूप में लौटाता है, और कॉल करने वाला इसकी जांच करता है स्पष्ट रूप से. यह स्पष्ट, पूर्वानुमानित, परीक्षण करने में आसान है - कीमत है थोड़ी अधिक वाचालता.

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 गो में मौजूद है लेकिन अपूरणीय त्रुटियों (जैसे बग,) के लिए आरक्षित है उल्लंघन किए गए अपरिवर्तनीय), सामान्य नियंत्रण प्रवाह के लिए नहीं। हम और गहराई तक जाएंगे defer/recover के साथ फ़ंक्शन मॉड्यूल। अभी के लिए: इसका उपयोग न करें if err != nil पैटर्न का।

इसे अजमाएं

व्यायाम#go.m2.l5.e1
प्रयास: 0लोड हो रहा है...

strconv.Atoi से त्रुटि को संभालें: यदि गलती है! = शून्य, इसे प्रिंट करें और वापस लौटें; अन्यथा एन प्रिंट करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

विहित पैटर्न: `err != nil` जांचें, लॉग/रिटर्न करें, फिर `n` का उपयोग करें।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम#go.m2.l5.e2
प्रयास: 0लोड हो रहा है...

सुरक्षितडिव लागू करें: यदि बी == 0 वापसी 0 और एक त्रुटियां। नया ('प्रति शून्य विभाजन'); अन्यथा ए/बी और शून्य।

संपादक लोड हो रहा है...
संकेत दिखाएँ

रन-टाइम घबराहट से बचने के लिए डिवीज़न से पहले `b == 0` चेक करें।

3 प्रयासों के बाद समाधान उपलब्ध है

Quiz#go.m2.l5.e3
तैयार

गो में किसी त्रुटि को संभालने का मुहावरेदार पैटर्न कौन सा है?

Go
v, err := f()
// poi?
उत्तर विकल्प

संक्षिप्त

  • 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 केवल अप्राप्य त्रुटियों के लिए, सामान्य नियंत्रण प्रवाह के लिए नहीं।