Lompati ke konten utama
Modul 2 · Pelajaran 5 dari 510/50 dalam kursus~12 min
Pelajaran modul (5/5)

Kesalahan: pola `if err != nil`

Di Go, kesalahan adalah nilai, bukan pengecualian. Sebuah fungsi yang bisa fail mengembalikan kesalahan sebagai nilai terakhir, dan pemanggil memeriksanya secara eksplisit. Ini eksplisit, dapat diprediksi, mudah untuk diuji — harganya sesuai sedikit lebih banyak verbositas.

Antarmuka error

error adalah antarmuka kecil yang dibangun ke dalam bahasa:

Go
type error interface {
    Error() string
}

Tipe apa pun yang mengimplementasikan Error() string adalah error.

Pola mendasar

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

Anda akan melihat ini ribuan kali: ini adalah kode idiomatis untuk setiap orang panggilan yang bisa salah. Jangan merasa bersalah tentang pengulangannya - ini adalah sebuah fitur, bukan sebuah bug.

Kesalahan pembuatan: errors.New dan fmt.Errorf

Go
import (
    "errors"
    "fmt"
)

err1 := errors.New("file mancante")
err2 := fmt.Errorf("apertura %q fallita: permesso negato", path)

fmt.Errorf sangat cocok bila Anda ingin memasukkan variabel ke dalam pesan.

Membungkus dengan %w

Untuk menyebarkan kesalahan dengan menambahkan konteks TANPA kehilangan yang asli:

Go
f, err := os.Open(path)
if err != nil {
    return fmt.Errorf("config: %w", err)
}

%w "membungkus" kesalahan asli, nanti dapat dipulihkan dengan errors.Is (kesetaraan untuk penjaga) atau errors.As (untuk tipe beton):

Go
if errors.Is(err, os.ErrNotExist) {
    // file inesistente, gestione speciale
}

Kesalahan penjaga

Ini adalah kesalahan yang diekspor sebagai variabel, digunakan untuk perbandingan dengan 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 dan recover (pratinjau)

panic ada di Go tetapi dicadangkan untuk kesalahan yang tidak dapat dipulihkan (misalnya bug, dilanggar invarian), bukan untuk aliran kontrol normal. Kami akan masuk lebih dalam modul Fungsi dengan defer/recover. Untuk saat ini: jangan gunakan di tempatnya dari pola if err != nil.

Cobalah

Latihan#go.m2.l5.e1
Upaya: 0Memuat…

Tangani kesalahan dari strconv.Atoi: if err != nil, cetak dan kembalikan; jika tidak, cetak n.

Memuat editor…
Tunjukkan petunjuk

Pola kanonik: centang `err != nil`, log/return, lalu gunakan `n`.

Solusi tersedia setelah 3 upaya

Latihan#go.m2.l5.e2
Upaya: 0Memuat…

Terapkan safeDiv: if b == 0 return 0 dan error.New('divisione per zero'); jika tidak a/b dan nihil.

Memuat editor…
Tunjukkan petunjuk

Centang `b == 0` SEBELUM pembagian untuk menghindari kepanikan run-time.

Solusi tersedia setelah 3 upaya

Quiz#go.m2.l5.e3
Siap

Pola idiomatis manakah yang digunakan untuk menangani kesalahan di Go?

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

Rekap

  • error adalah antarmuka dengan satu metode Error() string.
  • Pola kanonik: v, err := f(); if err != nil { return err }.
  • Buat kesalahan dengan errors.New(msg) atau fmt.Errorf("ctx: %w", err).
  • Gunakan %w untuk membungkus dan errors.Is / errors.As untuk memeriksa rantai.
  • panic hanya untuk kesalahan yang tidak dapat diperbaiki, BUKAN untuk aliran kontrol normal.