தொகுதி பாடங்கள் (5/5)
பிழைகள்: `if err != nil` முறை
Go இல், பிழைகள் மதிப்புகள், விதிவிலக்குகள் அல்ல. முடியும் ஒரு செயல்பாடு தோல்வியானது பிழையை கடைசி மதிப்பாக வழங்குகிறது, மேலும் அழைப்பாளர் அதைச் சரிபார்க்கிறார் வெளிப்படையாக. இது வெளிப்படையானது, யூகிக்கக்கூடியது, சோதிக்க எளிதானது - விலை இன்னும் கொஞ்சம் வாய்மொழி.
error இடைமுகம்
error என்பது மொழியில் கட்டமைக்கப்பட்ட ஒரு சிறிய இடைமுகம்:
type error interface {
Error() string
}Error() string ஐ செயல்படுத்தும் எந்த வகையும் error ஆகும்.
அடிப்படை முறை
v, err := operazione()
if err != nil {
// gestisci o propaga
return err
}
// usa vநீங்கள் இதை ஆயிரக்கணக்கான முறை பார்ப்பீர்கள்: இது ஒவ்வொருவருக்குமான idiomatic code தவறான அழைப்பு. மீண்டும் மீண்டும் செய்வதைப் பற்றி குற்ற உணர்வு கொள்ள வேண்டாம் - இது ஒரு அம்சம், இல்லை ஒரு பிழை.
கட்டிடப் பிழைகள்: 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 இல் உள்ளது ஆனால் மீட்க முடியாத பிழைகளுக்கு (எ.கா. பிழைகள்,
மீறப்பட்ட மாறுபாடுகள்), சாதாரண கட்டுப்பாட்டு ஓட்டத்திற்காக அல்ல. நாம் இன்னும் ஆழமாகச் செல்வோம்
defer/recover உடன் செயல்பாடுகள் தொகுதி. இப்போதைக்கு: இதை பயன்படுத்த வேண்டாம் இடத்தில்
if err != nil வடிவத்தின்.
முயற்சி செய்து பாருங்கள்
strconv.Atoi இலிருந்து பிழையைக் கையாளவும்: பிழை என்றால் != nil, அதை அச்சிட்டுத் திரும்பவும்; இல்லையெனில் அச்சிட n.
குறிப்பைக் காட்டு
நியமன முறை: `err != nil`, log/return என்பதைச் சரிபார்த்து, பிறகு `n` ஐப் பயன்படுத்தவும்.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
SafeDiv ஐ செயல்படுத்தவும்: b == 0 0 மற்றும் பிழைகள் இருந்தால். புதிய ('பூஜ்ஜியத்திற்கு பிரிவு'); இல்லையெனில் a/b மற்றும் nil.
குறிப்பைக் காட்டு
ரன்-டைம் பீதியைத் தவிர்க்க, பிரிப்பதற்கு முன் `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மீட்டெடுக்க முடியாத பிழைகளுக்கு மட்டுமே, சாதாரண கட்டுப்பாட்டு ஓட்டத்திற்கு அல்ல.