Direct naar de hoofdinhoud
Module 2 · Les 5 van 510/50 in de cursus~12 min
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:

Go
type error interface {
    Error() string
}

Elk type dat Error() string implementeert, is een error.

Het fundamentele patroon

Go
v, err := operazione()
if err != nil {
    // gestisci o propaga
    return err
}
// usa v

Je 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

Go
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:

Go
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):

Go
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:

Go
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

Oefening#go.m2.l5.e1
Pogingen: 0Laden…

Behandel de fout van strconv.Atoi: als err != nul, druk het af en keer terug; anders print n.

Editor laden…
Toon hint

Het canonieke patroon: vink `err != nil` aan, log/return en gebruik dan `n`.

Oplossing beschikbaar na 3 pogingen

Oefening#go.m2.l5.e2
Pogingen: 0Laden…

Implementeer safeDiv: als b == 0 retourneer 0 en een fouten.New('divisione per zero'); anders a/b en nul.

Editor laden…
Toon hint

Controleer `b == 0` VOOR de deling om runtime-paniek te voorkomen.

Oplossing beschikbaar na 3 pogingen

Quiz#go.m2.l5.e3
Klaar

Wat is het idiomatische patroon om een ​​fout in Go af te handelen?

Go
v, err := f()
// poi?
Antwoordmogelijkheden

Samenvatten

  • error is een interface met één methode Error() string.
  • Canoniek patroon: v, err := f(); if err != nil { return err }.
  • Bouwfouten met errors.New(msg) of fmt.Errorf("ctx: %w", err).
  • Gebruik %w voor het inpakken en errors.Is / errors.As om de ketting te inspecteren.
  • panic alleen voor onherstelbare fouten, NIET voor normale controlestroom.