முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 6 · பாடம் 5 இன் 5பாடத்திட்டத்தில் 30/50~14 min
தொகுதி பாடங்கள் (5/5)

பிழை இடைமுகம்

error in Go என்பது ஒரு முக்கிய வார்த்தை அல்ல: இது ஒரு உள்ளமைக்கப்பட்ட இடைமுகம் ஒற்றை முறை.

Go
type error interface {
    Error() string
}

Error() string உள்ள எதுவும் error ஆகும். உடன் இணைந்து செயல்பாடுகளிலிருந்து (T, error) திரும்புவதற்கான மாநாடு, அது Go இல் பிழை கையாளுதலின் அடித்தளம்.

சென்டினல் பிழைகள்

Go
import "errors"

var ErrNotFound = errors.New("non trovato")

func find(key string) (string, error) {
    // ...
    return "", ErrNotFound
}

சென்டினல் என்பது ஏற்றுமதி செய்யப்பட்ட error மதிப்பாகும். ஒரு குறிப்பிட்ட பிழை வழக்கை அடையாளம் காண ஒப்பிடவும்.

தனிப்பயன் பிழைகள் (தரவுடன்)

சூழலை எடுத்துச் செல்ல (எ.கா. விடுபட்ட விசை) நீங்கள் ஒரு வகையை வரையறுக்கிறீர்கள்:

Go
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 தொகுப்பைப் பயன்படுத்தவும்:

Go
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 உடன் மடக்குதல்

Go
if err := find("k"); err != nil {
    return fmt.Errorf("operazione X: %w", err)
}

%w (%s அல்லது %v) முடக்கும் ஒரு புதிய பிழையை உருவாக்குகிறது அசல், சங்கிலியை errors.Is/As மூலம் வழிநடத்தும்.

கையாளும் முறை

Go
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 உடன் பாகுபாடு காட்டவும்.

முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#go.m6.l5.e1
முயற்சிகள்: 0ஏற்றுகிறது…

*ErrNotFound இல் Error() சரத்தை செயல்படுத்தவும், அது 'non trovato: <Key>' என்பதை வழங்கும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

`fmt.Println(err)` தானாகவே உங்கள் struct இல் Error() முறையை அழைக்கிறது.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

உடற்பயிற்சி#go.m6.l5.e2
முயற்சிகள்: 0ஏற்றுகிறது…

பிழைகளைப் பயன்படுத்தவும். பிழையானது செண்டினல் ErrVuoto க்கு சமமானதா என்பதைச் சரிபார்க்கவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

`தவறுகள்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

Quiz#go.m6.l5.e3
தயார்

பிழையைச் செயல்படுத்தும் முறையின் சரியான கையொப்பம் என்ன?

Go
func (e *MyErr) ??? {}
பதில் விருப்பங்கள்

மறுபரிசீலனை

  • error = interface { Error() string }, உள்ளமைக்கப்பட்டவை.
  • சூழல் இல்லாமல் அறியப்பட்ட நிகழ்வுகளுக்கு errors.New("...") உடன் சென்டினல்கள்.
  • சூழலைக் கொண்டு செல்லும் புலங்களுடன் தனிப்பயன் பிழை வகைகள்.
  • errors.Is(err, target): ரேப்பிங்கிற்கு வலுவான ஒப்பீடு.
  • errors.As(err, &target): கான்கிரீட் வகை பிரித்தெடுத்தல்.
  • fmt.Errorf("...: %w", err): சங்கிலியைப் பாதுகாக்கும் மடக்குதல்.
  • ஒருபோதும் %v / %s மடிக்க: எப்போதும் %w ஐப் பயன்படுத்தவும்.