त्रुटि रैपिंग और अनरैपिंग
%w, errors.Is और errors.As का उपयोग करना
त्रुटि रैपिंग और अनरैपिंग, CoddyKit पर Go Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Go Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Go Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
त्रुटि रैपिंग क्या है?
त्रुटि रैपिंग किसी नई त्रुटि के भीतर मूल त्रुटि को समाहित करती है। इससे प्रोग्राम के माध्यम से जाँच के लिए मूल त्रुटि सुरक्षित रहती है और साथ ही संदर्भ भी जुड़ता है। इसे गो 1.13 में उचित रूप से प्रस्तुत किया गया:
package main
import ("fmt"; "errors")
var ErrDB = errors.New("database unreachable")
func queryUsers() error {
return fmt.Errorf("queryUsers: %w", ErrDB)
}
func loadProfile(id int) error {
return fmt.Errorf("loadProfile(%d): %w", id, queryUsers())
}
func main() {
err := loadProfile(42)
fmt.Println(err) // loadProfile(42): queryUsers: database unreachable
}%w क्रिया
त्रुटि को लपेटने के लिए fmt.Errorf में %v के बजाय %w का उपयोग करें। लपेटी गई त्रुटि errors.Unwrap के माध्यम से उपलब्ध होती है:
package main
import ("fmt"; "errors")
func main() {
inner := errors.New("inner error")
outer := fmt.Errorf("outer: %w", inner)
fmt.Println(outer) // outer: inner error
fmt.Println(errors.Unwrap(outer)) // inner error
fmt.Println(errors.Is(outer, inner)) // true
}errors.Unwrap
errors.Unwrap शृंखला में अगली त्रुटि (लपेटी गई त्रुटि) लौटाता है, या यदि कोई न हो तो nil लौटाता है:
package main
import ("fmt"; "errors")
type Layer struct{ msg string; err error }
func (l *Layer) Error() string { return l.msg }
func (l *Layer) Unwrap() error { return l.err }
func main() {
root := errors.New("root")
mid := &Layer{"mid", root}
top := &Layer{"top", mid}
fmt.Println(errors.Unwrap(top)) // mid
fmt.Println(errors.Unwrap(mid)) // root
fmt.Println(errors.Unwrap(root)) // <nil>
}errors.Is — शृंखला में खोज
errors.Is(err, target) त्रुटि शृंखला का पुनरावर्ती रूप से आवरण हटाता है, जब तक कि उसे मेल न मिल जाए या nil तक न पहुँच जाए:
package main
import ("fmt"; "errors")
var ErrNotFound = errors.New("not found")
func findItem(id int) error {
return fmt.Errorf("findItem(%d): %w",
id, fmt.Errorf("repo: %w", ErrNotFound))
}
func main() {
err := findItem(7)
fmt.Println(errors.Is(err, ErrNotFound)) // true — deep in chain
fmt.Println(err) // full message chain
}errors.As — प्रकारों के लिए शृंखला में खोज
errors.As(err, &target) शृंखला में ऐसी त्रुटि खोजता है जिसे लक्ष्य के प्रकार में असाइन किया जा सके:
package main
import ("fmt"; "errors")
type StatusError struct{ Code int }
func (e *StatusError) Error() string { return fmt.Sprintf("status %d", e.Code) }
func doRequest() error {
return fmt.Errorf("request: %w", &StatusError{503})
}
func main() {
err := doRequest()
var se *StatusError
if errors.As(err, &se) {
fmt.Println("status code:", se.Code) // 503
}
}शृंखलाओं के लिए कस्टम Unwrap
errors.Is और errors.As का समर्थन करने के लिए अपने कस्टम त्रुटि प्रकार पर Unwrap() error कार्यान्वित कीजिए:
package main
import ("fmt"; "errors")
type AppError struct {
Op string
Err error
}
func (e *AppError) Error() string { return fmt.Sprintf("%s: %v", e.Op, e.Err) }
func (e *AppError) Unwrap() error { return e.Err }
var ErrAuth = errors.New("unauthorized")
func main() {
err := &AppError{"login", ErrAuth}
fmt.Println(errors.Is(err, ErrAuth)) // true
}fmt.Errorf में %v बनाम %w
%v और %w के बीच अंतर:
package main
import ("fmt"; "errors")
func main() {
inner := errors.New("inner")
withV := fmt.Errorf("outer: %v", inner) // string only, no wrap
withW := fmt.Errorf("outer: %w", inner) // wraps inner
fmt.Println(errors.Is(withV, inner)) // false — not wrapped
fmt.Println(errors.Is(withW, inner)) // true — wrapped
}व्यवहार में रैपिंग: एचटीटीपी हैंडलर
लगातार की गई त्रुटि रैपिंग वास्तविक प्रणालियों में त्रुटियों की जाँच को आसान बनाती है:
package main
import "fmt"
func dbQuery(sql string) error {
return fmt.Errorf("db.Query(%q): connection refused", sql)
}
func getUserByID(id int) (string, error) {
if err := dbQuery("SELECT * FROM users WHERE id=?"); err != nil {
return "", fmt.Errorf("getUserByID(%d): %w", id, err)
}
return "Alice", nil
}
func handler() error {
_, err := getUserByID(1)
if err != nil {
return fmt.Errorf("handler: %w", err)
}
return nil
}
func main() { fmt.Println(handler()) }errors.Join — एकाधिक रैपिंग (गो 1.20+)
errors.Join ऐसी त्रुटि बनाता है जो कई त्रुटियों को लपेटती है। errors.Is उन सभी की जाँच करता है:
package main
import ("fmt"; "errors")
var ErrA = errors.New("err A")
var ErrB = errors.New("err B")
func main() {
joined := errors.Join(ErrA, ErrB)
fmt.Println(joined)
fmt.Println(errors.Is(joined, ErrA)) // true
fmt.Println(errors.Is(joined, ErrB)) // true
}आवरण हटाने की सर्वोत्तम कार्यप्रणालियाँ
त्रुटि रैपिंग के लिए दिशानिर्देश:
- प्रोग्राम के माध्यम से जाँच के लिए त्रुटि सुरक्षित रखने हेतु
%wसे लपेटें - संदर्भ के लिए संक्रिया का नाम जोड़ें:
fmt.Errorf("funcName: %w", err) - यदि कॉल करने वाले
errors.Isका उपयोग नहीं करेंगे तो पूर्वनिर्धारित त्रुटियों को न लपेटें - हर स्तर पर एक ही संदर्भ को दो बार लपेटने से बचें
- शृंखलाओं में भाग लेने के लिए कस्टम प्रकारों पर
Unwrap()कार्यान्वित करें
त्वरित जाँच
fmt.Errorf में %v और %w के उपयोग में क्या अंतर है?
पुनरावृत्ति: त्रुटि रैपिंग और आवरण हटाना
सारांश:
fmt.Errorf("ctx: %w", err)संदर्भ के साथ त्रुटि को लपेटता हैerrors.Unwrapशृंखला में अगली त्रुटि प्राप्त करता हैerrors.Isपहचान के मिलान के लिए शृंखला में खोजता हैerrors.Asप्रकार के मिलान के लिए शृंखला में खोजता है- कस्टम प्रकार
Unwrap() errorकार्यान्वित करते हैं errors.Joinकई त्रुटियों को लपेटता है (गो 1.20+)
एआई शिक्षक के साथ Go सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 51
- पाठ
- 203
अक्सर पूछे जाने वाले प्रश्न
क्या “त्रुटि रैपिंग और अनरैपिंग” पाठ निःशुल्क है?
हाँ — Go Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “त्रुटि रैपिंग और अनरैपिंग” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Go Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“त्रुटि रैपिंग और अनरैपिंग” में मैं क्या सीखूँगा?
%w, errors.Is और errors.As का उपयोग करना आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Go Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Go Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Go Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“त्रुटि रैपिंग और अनरैपिंग” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Go Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Go Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- error इंटरफ़ेस
- कस्टम त्रुटियाँ बनाना
- त्रुटि रैपिंग और अनरैपिंग
- panic, recover और defer