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:
type error interface {
Error() string
}Tipe apa pun yang mengimplementasikan Error() string adalah error.
Pola mendasar
v, err := operazione()
if err != nil {
// gestisci o propaga
return err
}
// usa vAnda 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
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:
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):
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:
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
Tangani kesalahan dari strconv.Atoi: if err != nil, cetak dan kembalikan; jika tidak, cetak n.
Tunjukkan petunjuk
Pola kanonik: centang `err != nil`, log/return, lalu gunakan `n`.
Solusi tersedia setelah 3 upaya
Terapkan safeDiv: if b == 0 return 0 dan error.New('divisione per zero'); jika tidak a/b dan nihil.
Tunjukkan petunjuk
Centang `b == 0` SEBELUM pembagian untuk menghindari kepanikan run-time.
Solusi tersedia setelah 3 upaya
Pola idiomatis manakah yang digunakan untuk menangani kesalahan di Go?
v, err := f()
// poi?Rekap
erroradalah antarmuka dengan satu metodeError() string.- Pola kanonik:
v, err := f(); if err != nil { return err }. - Buat kesalahan dengan
errors.New(msg)ataufmt.Errorf("ctx: %w", err). - Gunakan
%wuntuk membungkus danerrors.Is/errors.Asuntuk memeriksa rantai. panichanya untuk kesalahan yang tidak dapat diperbaiki, BUKAN untuk aliran kontrol normal.