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

பிழைகள்: `if err != nil` முறை

Go இல், பிழைகள் மதிப்புகள், விதிவிலக்குகள் அல்ல. முடியும் ஒரு செயல்பாடு தோல்வியானது பிழையை கடைசி மதிப்பாக வழங்குகிறது, மேலும் அழைப்பாளர் அதைச் சரிபார்க்கிறார் வெளிப்படையாக. இது வெளிப்படையானது, யூகிக்கக்கூடியது, சோதிக்க எளிதானது - விலை இன்னும் கொஞ்சம் வாய்மொழி.

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

நீங்கள் இதை ஆயிரக்கணக்கான முறை பார்ப்பீர்கள்: இது ஒவ்வொருவருக்குமான idiomatic code தவறான அழைப்பு. மீண்டும் மீண்டும் செய்வதைப் பற்றி குற்ற உணர்வு கொள்ள வேண்டாம் - இது ஒரு அம்சம், இல்லை ஒரு பிழை.

கட்டிடப் பிழைகள்: 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 இல் உள்ளது ஆனால் மீட்க முடியாத பிழைகளுக்கு (எ.கா. பிழைகள், மீறப்பட்ட மாறுபாடுகள்), சாதாரண கட்டுப்பாட்டு ஓட்டத்திற்காக அல்ல. நாம் இன்னும் ஆழமாகச் செல்வோம் defer/recover உடன் செயல்பாடுகள் தொகுதி. இப்போதைக்கு: இதை பயன்படுத்த வேண்டாம் இடத்தில் if err != nil வடிவத்தின்.

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

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

strconv.Atoi இலிருந்து பிழையைக் கையாளவும்: பிழை என்றால் != nil, அதை அச்சிட்டுத் திரும்பவும்; இல்லையெனில் அச்சிட n.

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

நியமன முறை: `err != nil`, log/return என்பதைச் சரிபார்த்து, பிறகு `n` ஐப் பயன்படுத்தவும்.

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

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

SafeDiv ஐ செயல்படுத்தவும்: b == 0 0 மற்றும் பிழைகள் இருந்தால். புதிய ('பூஜ்ஜியத்திற்கு பிரிவு'); இல்லையெனில் a/b மற்றும் nil.

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

ரன்-டைம் பீதியைத் தவிர்க்க, பிரிப்பதற்கு முன் `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 மீட்டெடுக்க முடியாத பிழைகளுக்கு மட்டுமே, சாதாரண கட்டுப்பாட்டு ஓட்டத்திற்கு அல்ல.