Modulelessen (5/5)
Fouten: het patroon `if err != nil`
In Go zijn fouten waarden, geen uitzonderingen. Een functie die dat kan fail retourneert de fout als de laatste waarde, en de aanroeper controleert deze expliciet. Het is expliciet, voorspelbaar, gemakkelijk te testen – de prijs is dat ook iets meer breedsprakigheid.
De error-interface
error is een kleine interface ingebouwd in de taal:
type error interface {
Error() string
}Elk type dat Error() string implementeert, is een error.
Het fundamentele patroon
v, err := operazione()
if err != nil {
// gestisci o propaga
return err
}
// usa vJe zult dit duizenden keren zien: het is de idiomatische code voor iedereen feilbare oproep. Voel je niet schuldig over de herhaling – het is een kenmerk, niet een bug.
Bouwfouten: errors.New en fmt.Errorf
import (
"errors"
"fmt"
)
err1 := errors.New("file mancante")
err2 := fmt.Errorf("apertura %q fallita: permesso negato", path)fmt.Errorf is perfect als u variabelen in het bericht wilt opnemen.
Inpakken met %w
Om een fout te verspreiden door context toe te voegen ZONDER het origineel te verliezen:
f, err := os.Open(path)
if err != nil {
return fmt.Errorf("config: %w", err)
}%w "verpakt" de oorspronkelijke fout, die later kan worden hersteld met
errors.Is (gelijkheid voor schildwachten) of errors.As (voor betontype):
if errors.Is(err, os.ErrNotExist) {
// file inesistente, gestione speciale
}Sentinel-fouten
Dit zijn fouten die als variabelen worden geëxporteerd en worden gebruikt voor vergelijkingen met errors.Is:
var ErrNotFound = errors.New("non trovato")
func find(id int) (Item, error) {
// ...
return Item{}, ErrNotFound
}
// chiamante:
if errors.Is(err, ErrNotFound) { ... }panic en recover (voorbeeld)
panic bestaat in Go, maar is gereserveerd voor onherstelbare fouten (bijvoorbeeld bugs,
geschonden invarianten), niet voor normale controlestroom. We gaan er dieper op in
de module Functies met defer/recover. Voor nu: gebruik het niet op zijn plaats
van het patroon if err != nil.
Probeer het
Behandel de fout van strconv.Atoi: als err != nul, druk het af en keer terug; anders print n.
Toon hint
Het canonieke patroon: vink `err != nil` aan, log/return en gebruik dan `n`.
Oplossing beschikbaar na 3 pogingen
Implementeer safeDiv: als b == 0 retourneer 0 en een fouten.New('divisione per zero'); anders a/b en nul.
Toon hint
Controleer `b == 0` VOOR de deling om runtime-paniek te voorkomen.
Oplossing beschikbaar na 3 pogingen
Wat is het idiomatische patroon om een fout in Go af te handelen?
v, err := f()
// poi?Samenvatten
erroris een interface met één methodeError() string.- Canoniek patroon:
v, err := f(); if err != nil { return err }. - Bouwfouten met
errors.New(msg)offmt.Errorf("ctx: %w", err). - Gebruik
%wvoor het inpakken enerrors.Is/errors.Asom de ketting te inspecteren. panicalleen voor onherstelbare fouten, NIET voor normale controlestroom.