Membungkus Error dengan `%w`
Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 39 dari 68.
Saat error terjadi di aplikasimu, error tersebut sering kali memerlukan konteks tambahan saat merambat naik melalui berbagai lapisan kodemu. Go menyediakan mekanisme yang andal untuk menangani hal ini melalui pembungkusan error menggunakan kata format %w dengan fmt.Errorf.
Error wrapping memungkinkan kamu menambahkan informasi kontekstual ke error yang sudah ada sambil mempertahankan error asli di dalamnya. Ini membuat rantai error yang menyimpan riwayat lengkap tentang apa yang salah:
originalErr := errors.New("file not found")
wrappedErr := fmt.Errorf("failed to load config: %w", originalErr)Verb %w bersifat khusus: verb ini memberi tahu fmt.Errorf untuk membungkus error, bukan sekadar mengubahnya menjadi string. Ini mempertahankan error asli agar dapat diperiksa nanti menggunakan fungsi seperti errors.Is dan errors.As.
Pola ini sangat berguna dalam aplikasi yang lebih besar, tempat sebuah error mungkin melewati beberapa fungsi, dan masing-masing menambahkan konteksnya sendiri. Misalnya, error koneksi database mungkin dibungkus dengan "failed to connect to database", lalu dibungkus lagi dengan "unable to start server", sehingga membentuk jejak yang jelas tentang apa yang terjadi dan di mana.
Tantangan
MudahBangun sistem pemrosesan file yang membungkus error dengan informasi kontekstual saat error tersebut merambat melalui berbagai lapisan aplikasi. Tantangan ini menunjukkan cara menggunakan verba format %w dengan fmt.Errorf untuk membuat rantai error yang mempertahankan error asli sekaligus menambahkan konteks yang bermakna.
Kamu akan menerima dua input:
- Sebuah string yang berisi detail operasi file dengan format
"filename,operation,status"(misalnya,"config.json,read,permission_denied") - Sebuah string yang berisi konteks sistem dengan format
"service_name,component"(misalnya,"UserService,ConfigLoader")
Tugasmu adalah:
- Urai input pertama dengan memisahkannya berdasarkan koma untuk mendapatkan nama file, operasi, dan status
- Urai input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan nama service dan komponen
- Buat error asli berdasarkan status menggunakan
errors.New():- Jika status adalah
"permission_denied":"permission denied" - Jika status adalah
"not_found":"file not found" - Jika status adalah
"corrupted":"file corrupted" - Untuk status lainnya:
"unknown error"
- Jika status adalah
- Buat error terbungkus tingkat file menggunakan
fmt.Errorfdengan%w:"failed to [operation] file [filename]: %w" - Buat error terbungkus tingkat komponen:
"[component] error: %w" - Buat error terbungkus tingkat service:
"[service_name] operation failed: %w" - Tampilkan rantai error dengan mencetak setiap tingkat:
"Original error: [original_error_message]""File level: [file_level_error_message]""Component level: [component_level_error_message]""Service level: [service_level_error_message]"
- Tampilkan ringkasan rantai error:
"Error Chain Summary:""File: [filename]""Operation: [operation]""Component: [component]""Service: [service_name]""Root cause: [original_error_message]"
Gunakan package strings untuk memisahkan string input berdasarkan koma, package errors untuk membuat error asli, dan package fmt untuk membuat error terbungkus. Tantangan ini menunjukkan cara pembungkusan error dengan %w membuat jejak konteks yang jelas saat error berpindah melalui berbagai lapisan aplikasi, sehingga proses debug menjadi jauh lebih efektif.
Coba sendiri
package main
import (
"errors"
"fmt"
"strings"
)
func main() {
// Baca input
var fileDetails string
var systemContext string
fmt.Scanln(&fileDetails)
fmt.Scanln(&systemContext)
// Uraikan input
fileInfo := strings.Split(fileDetails, ",")
filename := fileInfo[0]
operation := fileInfo[1]
status := fileInfo[2]
contextInfo := strings.Split(systemContext, ",")
serviceName := contextInfo[0]
component := contextInfo[1]
// TODO: Tulis kodemu di bawah ini
// Buat error asli berdasarkan status
// Buat error yang dibungkus pada tingkat file
// Buat error yang dibungkus pada tingkat komponen
// Buat error yang dibungkus pada tingkat layanan
// Cetak setiap tingkat error dan ringkasannya
}Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika & Alur
1Alur Kontrol Lanjutan
switch dengan `fallthrough`Keluar dari Perulangan BersarangMelanjutkan Perulangan TertentuPernyataan `goto`Rangkuman, Kontrol Perulangan Lanjutan4Proyek: Daftar Tugas Sederhana
Menyiapkan ProyekMenambahkan Tugas7Penanganan Error secara Mendalam
Tipe Error KustomMembungkus Error dengan `%w`Membuka Bungkus Error dengan `errors.Is`Membuka Bungkus Error dengan `errors.As`Memahami `panic`Menggunakan `recover`Rangkuman: Pembagian Aman2Struct dan Method
Mendefinisikan Method pada StructPenerima NilaiPenerima PointerMemilih PenerimaMethod vs FungsiRekap: Perilaku Struct5Map secara Mendalam
Map Berisi StructPointer sebagai Nilai MapMenguji Map NilMembandingkan MapRingkasan: Penghitung Frekuensi Kata8Proyek: Inventaris Sederhana
Gambaran Umum ProyekMemeriksa Stok3Interface (Dasar)
Apa Itu Interface?Mendefinisikan InterfaceMengimplementasikan InterfaceMenggunakan Tipe InterfaceInterface KosongType AssertionType SwitchRingkasan: Bentuk dan PerilakuLatihan sendiri: Compiler Go online