मॉड्यूल पाठ (5/5)
त्रुटियाँ: `यदि ग़लती !=शून्य` पैटर्न
गो में, त्रुटियाँ मान हैं, अपवाद नहीं। एक फ़ंक्शन जो कर सकता है विफल त्रुटि को अंतिम मान के रूप में लौटाता है, और कॉल करने वाला इसकी जांच करता है स्पष्ट रूप से. यह स्पष्ट, पूर्वानुमानित, परीक्षण करने में आसान है - कीमत है थोड़ी अधिक वाचालता.
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 गो में मौजूद है लेकिन अपूरणीय त्रुटियों (जैसे बग,) के लिए आरक्षित है
उल्लंघन किए गए अपरिवर्तनीय), सामान्य नियंत्रण प्रवाह के लिए नहीं। हम और गहराई तक जाएंगे
defer/recover के साथ फ़ंक्शन मॉड्यूल। अभी के लिए: इसका उपयोग न करें
if err != nil पैटर्न का।
इसे अजमाएं
strconv.Atoi से त्रुटि को संभालें: यदि गलती है! = शून्य, इसे प्रिंट करें और वापस लौटें; अन्यथा एन प्रिंट करें।
संकेत दिखाएँ
विहित पैटर्न: `err != nil` जांचें, लॉग/रिटर्न करें, फिर `n` का उपयोग करें।
3 प्रयासों के बाद समाधान उपलब्ध है
सुरक्षितडिव लागू करें: यदि बी == 0 वापसी 0 और एक त्रुटियां। नया ('प्रति शून्य विभाजन'); अन्यथा ए/बी और शून्य।
संकेत दिखाएँ
रन-टाइम घबराहट से बचने के लिए डिवीज़न से पहले `b == 0` चेक करें।
3 प्रयासों के बाद समाधान उपलब्ध है
गो में किसी त्रुटि को संभालने का मुहावरेदार पैटर्न कौन सा है?
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केवल अप्राप्य त्रुटियों के लिए, सामान्य नियंत्रण प्रवाह के लिए नहीं।