Sistem standar untuk penanganan error di aplikasi Go (Gin-based), dengan dukungan:
✅ Kode error yang konsisten
✅ Mapping otomatis ke HTTP status + pesan aman
✅ Logging internal saat debug
✅ Respons JSON yang bisa dikustom status-nya (tidak hanya "error")
go get github.com/gogaruda/apperror@v1.3.0err := apperror.New(apperror.CodeValidationError, "Nama wajib diisi", nil)err := apperror.New(apperror.CodeValidationError, "Nama wajib diisi", nil, http.StatusBadRequest)err := apperror.NewWithStatus("TOKEN_EXPIRED", "Token kadaluarsa", nil, 401, "expired")err := apperror.New("TOKEN_EXPIRED", "Token kadaluarsa", nil, 401).
WithResponseStatus("expired")func SomeHandler(c *gin.Context) {
err := doSomething()
if err != nil {
apperror.HandleHTTPError(c, err)
return
}
c.JSON(200, gin.H{"status": "ok"})
}if apperror.Is(err, apperror.CodeUnauthorized) {
// Redirect ke login
}{
"code": 401,
"status": "expired",
"message": "Token kadaluarsa"
}Atau default (tanpa ResponseStatus):
{
"code": 500,
"status": "error",
"message": "Terjadi kesalahan internal"
}- Cek apakah error adalah
InitError - Cek apakah ada mapping
Code → HTTP status + User message - Jika tidak ditemukan:
- Pakai HTTP status dari error (jika ada)
- Default ke 500
- Status JSON:
- Jika
ResponseStatusdi-set → dipakai - Jika tidak → fallback ke
"error"
- Pesan internal hanya ditampilkan di log jika
GIN_MODE=debug
Gunakan apperror untuk:
- Validasi input/form
- Kesalahan otentikasi dan otorisasi
- Konflik resource
- Error dari database atau layanan eksternal
- Penanganan logika bisnis yang bisa diharapkan