মূল কন্টেন্টে যান
মডিউল 2 · 5-এর পাঠ 5কোর্সে 10/50~12 min
মডিউল পাঠ (5/5)

ত্রুটি: `যদি ভুল!= শূন্য` প্যাটার্ন

Go-তে, ত্রুটিগুলি মান, ব্যতিক্রম নয়। একটি ফাংশন যে পারে fail শেষ মান হিসাবে ত্রুটিটি ফেরত দেয় এবং কলকারী এটি পরীক্ষা করে স্পষ্টভাবে এটা সুস্পষ্ট, অনুমানযোগ্য, পরীক্ষা করা সহজ — দাম হল একটু বেশি শব্দচয়ন।

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 Go-তে বিদ্যমান কিন্তু অপুনরুদ্ধারযোগ্য ত্রুটির জন্য সংরক্ষিত (যেমন বাগ, লঙ্ঘিত invariants), স্বাভাবিক নিয়ন্ত্রণ প্রবাহের জন্য নয়। আমরা আরও গভীরে যাব defer/recover এর সাথে ফাংশন মডিউল। আপাতত: এটি ব্যবহার করবেন না জায়গায় if err != nil প্যাটার্নের।

চেষ্টা করে দেখুন

ব্যায়াম#go.m2.l5.e1
প্রচেষ্টা: 0লোড হচ্ছে...

strconv.Atoi থেকে ত্রুটি হ্যান্ডেল করুন: যদি err != nil, এটি প্রিন্ট করুন এবং ফেরত দিন; অন্যথায় প্রিন্ট n.

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

ক্যানোনিকাল প্যাটার্ন: `err != nil` চেক করুন, লগ/রিটার্ন করুন, তারপর `n` ব্যবহার করুন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#go.m2.l5.e2
প্রচেষ্টা: 0লোড হচ্ছে...

safeDiv প্রয়োগ করুন: যদি b == 0 রিটার্ন করে 0 এবং একটি errors.New('divisione per zero'); অন্যথায় a/b এবং শূন্য।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

রান-টাইম প্যানিক এড়াতে বিভাগের আগে `b == 0` চেক করুন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

Quiz#go.m2.l5.e3
প্রস্তুত

Go-তে একটি ত্রুটি হ্যান্ডেল করার জন্য মূর্তিপূর্ণ প্যাটার্ন কোনটি?

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 শুধুমাত্র পুনরুদ্ধারযোগ্য ত্রুটির জন্য, স্বাভাবিক নিয়ন্ত্রণ প্রবাহের জন্য নয়।