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(misalnyaErrNotFound) - Tipe galat khusus:
XxxError(misalnyaValidationError) - 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 penandafmt.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() stringuntuk membuat tipe galat khusus - Tambahkan
Unwrap() erroragar dapat berpartisipasi dalam rantai galat - Gunakan
errors.Isuntuk pemeriksaan identitas,errors.Asuntuk ekstraksi tipe - Galat penanda:
ErrXxx; tipe khusus:XxxError errors.Joinmenggabungkan 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
- Interface error
- Membuat Error Khusus
- Pembungkusan dan Pelepasan Error
- panic, recover, dan defer