মডিউল পাঠ (5/5)
ত্রুটি: `যদি ভুল!= শূন্য` প্যাটার্ন
Go-তে, ত্রুটিগুলি মান, ব্যতিক্রম নয়। একটি ফাংশন যে পারে fail শেষ মান হিসাবে ত্রুটিটি ফেরত দেয় এবং কলকারী এটি পরীক্ষা করে স্পষ্টভাবে এটা সুস্পষ্ট, অনুমানযোগ্য, পরীক্ষা করা সহজ — দাম হল একটু বেশি শব্দচয়ন।
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 Go-তে বিদ্যমান কিন্তু অপুনরুদ্ধারযোগ্য ত্রুটির জন্য সংরক্ষিত (যেমন বাগ,
লঙ্ঘিত invariants), স্বাভাবিক নিয়ন্ত্রণ প্রবাহের জন্য নয়। আমরা আরও গভীরে যাব
defer/recover এর সাথে ফাংশন মডিউল। আপাতত: এটি ব্যবহার করবেন না জায়গায়
if err != nil প্যাটার্নের।
চেষ্টা করে দেখুন
strconv.Atoi থেকে ত্রুটি হ্যান্ডেল করুন: যদি err != nil, এটি প্রিন্ট করুন এবং ফেরত দিন; অন্যথায় প্রিন্ট n.
ইঙ্গিত দেখান
ক্যানোনিকাল প্যাটার্ন: `err != nil` চেক করুন, লগ/রিটার্ন করুন, তারপর `n` ব্যবহার করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
safeDiv প্রয়োগ করুন: যদি b == 0 রিটার্ন করে 0 এবং একটি errors.New('divisione per zero'); অন্যথায় a/b এবং শূন্য।
ইঙ্গিত দেখান
রান-টাইম প্যানিক এড়াতে বিভাগের আগে `b == 0` চেক করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
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শুধুমাত্র পুনরুদ্ধারযোগ্য ত্রুটির জন্য, স্বাভাবিক নিয়ন্ত্রণ প্রবাহের জন্য নয়।