Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Bangun 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:

  1. Urai input pertama dengan memisahkannya berdasarkan koma untuk mendapatkan nama file, operasi, dan status
  2. Urai input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan nama service dan komponen
  3. 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"
  4. Buat error terbungkus tingkat file menggunakan fmt.Errorf dengan %w: "failed to [operation] file [filename]: %w"
  5. Buat error terbungkus tingkat komponen: "[component] error: %w"
  6. Buat error terbungkus tingkat service: "[service_name] operation failed: %w"
  7. 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]"
  8. 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
	
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika & Alur

Latihan sendiri: Compiler Go online