For the complete documentation index, see llms.txt. This page is also available as Markdown.
Error Handler
Setelah memiliki standard response, langkah selanjutnya adalah menyempurnakan cara kita menangani error. Tidak semua error adalah "Internal Server Error". Client perlu tahu apakah error terjadi karena:
Input tidak valid (Bad Request)
Data tidak ditemukan (Not Found)
Tidak punya akses (Forbidden)
Belum login (Unauthorized)
Bab ini akan membangun sistem error handling yang konsisten dan informatif.
📂 Kode Lengkap Bab Ini:
Seluruh kode yang dibahas di bab ini tersedia di GitHub:
Saat ini, semua error dari service langsung dibungkus menjadi InternalServerError:
// Sebelumnyaiferr!=nil{response.SetError(u.log,w,http.StatusInternalServerError,response.AppBusinessStatusError,err,"Failed to list users")return}
Masalah:
Error "user not found" juga dianggap Internal Server Error (seharusnya 404)
Client tidak bisa membedakan jenis error
Tidak ada kode error standar untuk frontend
13.2 Desain Custom Error
Kita akan membuat custom error type yang mengimplementasikan interface error bawaan Go:
Contoh error yang akan dihasilkan:
Skenario
Code
HTTP Status
Message
Input tidak valid
E001
400
"Invalid input"
Data tidak ditemukan
E002
404
"Resource not found"
Akses ditolak
E003
403
"Forbidden"
Belum login
E004
401
"Unauthorized"
Error internal
E000
500
"Internal Server Error"
13.3 Implementasi Custom Error
Buat file pkg/errors/errors.go:
13.4 Update Response Helper
Sederhanakan SetError untuk menerima *BusinessError langsung:
13.5 Update Service Layer dengan BusinessError
Setiap error di repository bisa dipertahankan karena error di repository tidak akan ditampilkan sebagai reponse dan hanya disimpan dalam log. Namun error di level service dan handler harus diubah mengikuti bisnis error yang telah ditentukan.
Service layer sekarang mengembalikan *errors.BusinessError:
13.6 Update Handler Layer
Handler sekarang jauh lebih bersih:
13.7 Aliran Error dari Repository ke Client
Berikut diagram aliran error:
13.8 Contoh Response Error Setelah Implementasi
Error Not Found (404)
Error Invalid Input (400)
Error Internal Server (500)
Ringkasan Bab 13
Di bab ini kita telah belajar:
Konsep
Implementasi
Custom Error Type
BusinessError dengan Code, Message, HTTPStatus
Error Wrapping
Menggunakan %w dan Unwrap()
Error Constructors
InvalidInput(), NotFound(), Forbidden(), dll
Error Extraction
GetBusinessError() dengan errors.As()
Handler Simplification
Handler hanya panggil SetError(w, err)
Manfaat yang kita peroleh:
✅ Client bisa membedakan jenis error berdasarkan status code dan kode error