தொகுதி பாடங்கள் (5/5)
பிழை இடைமுகம்
error in Go என்பது ஒரு முக்கிய வார்த்தை அல்ல: இது ஒரு உள்ளமைக்கப்பட்ட இடைமுகம்
ஒற்றை முறை.
type error interface {
Error() string
}Error() string உள்ள எதுவும் error ஆகும். உடன் இணைந்து
செயல்பாடுகளிலிருந்து (T, error) திரும்புவதற்கான மாநாடு, அது
Go இல் பிழை கையாளுதலின் அடித்தளம்.
சென்டினல் பிழைகள்
import "errors"
var ErrNotFound = errors.New("non trovato")
func find(key string) (string, error) {
// ...
return "", ErrNotFound
}சென்டினல் என்பது ஏற்றுமதி செய்யப்பட்ட error மதிப்பாகும்.
ஒரு குறிப்பிட்ட பிழை வழக்கை அடையாளம் காண ஒப்பிடவும்.
தனிப்பயன் பிழைகள் (தரவுடன்)
சூழலை எடுத்துச் செல்ல (எ.கா. விடுபட்ட விசை) நீங்கள் ஒரு வகையை வரையறுக்கிறீர்கள்:
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 தொகுப்பைப் பயன்படுத்தவும்:
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 உடன் மடக்குதல்
if err := find("k"); err != nil {
return fmt.Errorf("operazione X: %w", err)
}%w (%s அல்லது %v) முடக்கும் ஒரு புதிய பிழையை உருவாக்குகிறது
அசல், சங்கிலியை errors.Is/As மூலம் வழிநடத்தும்.
கையாளும் முறை
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உடன் பாகுபாடு காட்டவும்.
முயற்சி செய்து பாருங்கள்
*ErrNotFound இல் Error() சரத்தை செயல்படுத்தவும், அது 'non trovato: <Key>' என்பதை வழங்கும்.
குறிப்பைக் காட்டு
`fmt.Println(err)` தானாகவே உங்கள் struct இல் Error() முறையை அழைக்கிறது.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
பிழைகளைப் பயன்படுத்தவும். பிழையானது செண்டினல் ErrVuoto க்கு சமமானதா என்பதைச் சரிபார்க்கவும்.
குறிப்பைக் காட்டு
`தவறுகள்.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
பிழையைச் செயல்படுத்தும் முறையின் சரியான கையொப்பம் என்ன?
func (e *MyErr) ??? {}மறுபரிசீலனை
error = interface { Error() string }, உள்ளமைக்கப்பட்டவை.- சூழல் இல்லாமல் அறியப்பட்ட நிகழ்வுகளுக்கு
errors.New("...")உடன் சென்டினல்கள். - சூழலைக் கொண்டு செல்லும் புலங்களுடன் தனிப்பயன் பிழை வகைகள்.
errors.Is(err, target): ரேப்பிங்கிற்கு வலுவான ஒப்பீடு.errors.As(err, &target): கான்கிரீட் வகை பிரித்தெடுத்தல்.fmt.Errorf("...: %w", err): சங்கிலியைப் பாதுகாக்கும் மடக்குதல்.- ஒருபோதும்
%v/%sமடிக்க: எப்போதும்%wஐப் பயன்படுத்தவும்.