0Pricing
Go Academy · Pelajaran

Membuat Error Khusus

errors.New, fmt.Errorf, dan error sentinel

Membuat Error Khusus adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.

Mengapa Menggunakan Tipe Galat Khusus?

Tipe galat khusus membawa data terstruktur selain pesan string, sehingga pemanggil dapat memeriksa dan merespons kondisi galat tertentu:

package main
import "fmt"

// Custom error type carries extra context
type HTTPError struct {
    StatusCode int
    Message    string
}

func (e *HTTPError) Error() string {
    return fmt.Sprintf("HTTP %d: %s", e.StatusCode, e.Message)
}

func fetch(url string) error {
    return &HTTPError{404, "page not found"}
}

func main() {
    err := fetch("http://example.com")
    fmt.Println(err) // HTTP 404: page not found
}

Mengimplementasikan Antarmuka error

Tipe apa pun yang memiliki metode Error() string memenuhi error:

package main
import "fmt"

type ValidationError struct {
    Field   string
    Value   interface{}
    Message string
}

func (e *ValidationError) Error() string {
    return fmt.Sprintf("validation: field %q value %v — %s", e.Field, e.Value, e.Message)
}

func validateAge(age int) error {
    if age < 0 || age > 150 {
        return &ValidationError{"age", age, "must be between 0 and 150"}
    }
    return nil
}

func main() {
    fmt.Println(validateAge(-5))
}

Galat Penanda dengan errors.New

Galat penanda adalah variabel tingkat paket untuk kondisi galat yang sudah dikenal:

package main
import ("fmt"; "errors")

var (
    ErrNotFound      = errors.New("not found")
    ErrUnauthorized  = errors.New("unauthorized")
    ErrAlreadyExists = errors.New("already exists")
)

func getUser(id int) (string, error) {
    if id != 1 { return "", ErrNotFound }
    return "Alice", nil
}

func main() {
    _, err := getUser(99)
    if errors.Is(err, ErrNotFound) {
        fmt.Println("user does not exist")
    }
}

fmt.Errorf dengan %w untuk Pembungkusan

fmt.Errorf dengan %w membungkus galat, dengan mempertahankan galat asli untuk errors.Is dan errors.As:

package main
import ("fmt"; "errors")

var ErrDatabase = errors.New("database error")

func queryDB() error {
    return fmt.Errorf("queryDB: %w", ErrDatabase)
}

func main() {
    err := queryDB()
    fmt.Println(err)                       // queryDB: database error
    fmt.Println(errors.Is(err, ErrDatabase)) // true — unwrapped
}

Galat Khusus dengan Unwrap

Implementasikan Unwrap() error pada tipe galat khusus Anda agar dapat berpartisipasi dalam rantai galat:

package main
import ("fmt"; "errors")

var ErrNotFound = errors.New("not found")

type QueryError struct {
    Query string
    Err   error
}

func (e *QueryError) Error() string {
    return fmt.Sprintf("query %q: %v", e.Query, e.Err)
}
func (e *QueryError) Unwrap() error { return e.Err }

func main() {
    err := &QueryError{"SELECT *", ErrNotFound}
    fmt.Println(err)
    fmt.Println(errors.Is(err, ErrNotFound)) // true
}

errors.Is — Pemeriksaan Identitas

errors.Is menelusuri rantai galat untuk mencari galat yang sama dengan target:

package main
import ("fmt"; "errors")

var ErrTimeout = errors.New("timeout")

func deepCall() error {
    return fmt.Errorf("layer3: %w", fmt.Errorf("layer2: %w", ErrTimeout))
}

func main() {
    err := deepCall()
    fmt.Println(errors.Is(err, ErrTimeout)) // true — found deep in chain
}

errors.As — Ekstraksi Tipe

errors.As menemukan galat pertama dalam rantai yang cocok dengan tipe target dan menetapkannya:

package main
import ("fmt"; "errors")

type PermissionError struct{ User string }
func (e *PermissionError) Error() string { return "permission denied for " + e.User }

func action(user string) error {
    return fmt.Errorf("action: %w", &PermissionError{user})
}

func main() {
    err := action("bob")
    var pe *PermissionError
    if errors.As(err, &pe) {
        fmt.Println("denied:", pe.User) // denied: bob
    }
}

Pembungkusan Beberapa Galat (Go 1.20+)

Go 1.20 menambahkan errors.Join dan fmt.Errorf dengan beberapa %w untuk menggabungkan galat:

package main
import ("fmt"; "errors")

func validate(name, email string) error {
    var errs []error
    if name == ""  { errs = append(errs, errors.New("name required")) }
    if email == "" { errs = append(errs, errors.New("email required")) }
    return errors.Join(errs...)
}

func main() {
    err := validate("", "")
    fmt.Println(err)
    // name required
    // email required
}

Konvensi Penamaan Tipe Galat

Konvensi untuk variabel dan tipe galat di Go:

  • Variabel galat penanda: ErrXxx (misalnya ErrNotFound)
  • Tipe galat khusus: XxxError (misalnya ValidationError)
  • Gunakan var tingkat paket untuk penanda, dan tipe penunjuk untuk galat yang kaya informasi
  • Ekspor agar dapat digunakan pemanggil dalam errors.Is / errors.As

Kapan Menggunakan Setiap Pendekatan

Memilih pendekatan galat yang tepat:

  • errors.New — sederhana, tanpa data tambahan, pemeriksaan identitas penanda
  • fmt.Errorf — pesan berformat dengan pembungkusan opsional
  • Tipe khusus — ketika pemanggil memerlukan data terstruktur (bidang, kode)
  • errors.Join — menggabungkan beberapa galat validasi

Pemeriksaan Singkat

Fungsi mana yang memungkinkan ekstraksi tipe galat tertentu dari rantai galat?

Ringkasan: Galat Khusus

Ringkasan:

  • Implementasikan Error() string untuk membuat tipe galat khusus
  • Tambahkan Unwrap() error agar dapat berpartisipasi dalam rantai galat
  • Gunakan errors.Is untuk pemeriksaan identitas, errors.As untuk ekstraksi tipe
  • Galat penanda: ErrXxx; tipe khusus: XxxError
  • errors.Join menggabungkan beberapa galat (Go 1.20+)

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Membuat Error Khusus” gratis?

Ya — teks lengkap “Membuat Error Khusus” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Membuat Error Khusus”?

errors.New, fmt.Errorf, dan error sentinel Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Go Academy?

Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Membuat Error Khusus” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Interface error
  2. Membuat Error Khusus
  3. Pembungkusan dan Pelepasan Error
  4. panic, recover, dan defer
← Kembali ke Go Academy