মডিউল পাঠ (5/5)
ত্রুটি ইন্টারফেস
Go-তে 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}
}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এর সাথে বৈষম্য করুন।
চেষ্টা করে দেখুন
*ErrNotFound-এ Error() স্ট্রিং প্রয়োগ করুন যাতে এটি 'non trovato: <key>' রিটার্ন করে।
ইঙ্গিত দেখান
`fmt.Println(err)` স্বয়ংক্রিয়ভাবে আপনার স্ট্রাকটে Error() পদ্ধতিকে কল করে।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
Errs ব্যবহার করুন
ইঙ্গিত দেখান
`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ব্যবহার করুন।