ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 2 · 5లో పాఠం 5కోర్సులో 10/50~12 min
మాడ్యూల్ పాఠాలు (5/5)

లోపాలు: `ఇఫ్ ఎర్రర్ != nil` నమూనా

గోలో, లోపాలు విలువలు, మినహాయింపులు కాదు. చేయగల ఫంక్షన్ ఫెయిల్ దోషాన్ని చివరి విలువగా చూపుతుంది మరియు కాలర్ దాన్ని తనిఖీ చేస్తాడు స్పష్టంగా. ఇది స్పష్టమైనది, ఊహించదగినది, పరీక్షించడం సులభం - ధర కొంచెం ఎక్కువ వెర్బోసిటీ.

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 గోలో ఉంది కానీ కోలుకోలేని లోపాల కోసం ప్రత్యేకించబడింది (ఉదా. బగ్‌లు, ఉల్లంఘించిన మార్పులేనివి), సాధారణ నియంత్రణ ప్రవాహం కోసం కాదు. మేము మరింత లోతుగా వెళ్తాము defer/recoverతో ఫంక్షన్ల మాడ్యూల్. ప్రస్తుతానికి: దీన్ని ఉపయోగించవద్దు స్థానంలో if err != nil నమూనా.

దీనిని ప్రయత్నించండి

వ్యాయామం#go.m2.l5.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

strconv.Atoi నుండి లోపాన్ని నిర్వహించండి: తప్పు చేస్తే != నిల్, దాన్ని ప్రింట్ చేసి తిరిగి ఇవ్వండి; లేకపోతే ప్రింట్ n.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

నియమానుగుణ నమూనా: `err != nil` తనిఖీ చేయండి, లాగ్/రిటర్న్ చేయండి, ఆపై `n` ఉపయోగించండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం#go.m2.l5.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

సేఫ్‌డివ్‌ని అమలు చేయండి: b == 0 రిటర్న్ 0 మరియు ఎర్రర్‌లు ఉంటే.కొత్త('సున్నాకి విభజన'); లేకపోతే a/b మరియు nil.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

రన్-టైమ్ భయాందోళనలను నివారించడానికి విభజనకు ముందు `b == 0`ని తనిఖీ చేయండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

Quiz#go.m2.l5.e3
సిద్ధంగా ఉంది

గోలో ఎర్రర్‌ను హ్యాండిల్ చేయడానికి ఇడియోమాటిక్ ప్యాటర్న్ ఏది?

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 పునరుద్ధరించలేని లోపాల కోసం మాత్రమే, సాధారణ నియంత్రణ ప్రవాహం కోసం కాదు.