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.0
err := 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
ResponseStatus
di-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