Error Helpers
Dokumentasi error handling dan factory functions.
ResponseError
ResponseError adalah custom error type yang mengimplementasikan interface error.
type ResponseError struct {
Code int `json:"code"`
Status bool `json:"status"`
Message string `json:"message"`
}
func (e *ResponseError) Error() string {
return e.Message
}
Factory Functions
NewBadRequest
Membuat error HTTP 400 Bad Request.
func NewBadRequest(message string) *ResponseError
Penggunaan:
if req.Email == "" {
return helpers.NewBadRequest("Email is required")
}
Response:
{
"code": 400,
"status": false,
"message": "Email is required"
}
NewUnauthorized
Membuat error HTTP 401 Unauthorized.
func NewUnauthorized(message string) *ResponseError
Penggunaan:
if !isValidToken {
return helpers.NewUnauthorized("Invalid or expired token")
}
Response:
{
"code": 401,
"status": false,
"message": "Invalid or expired token"
}
NewNotFound
Membuat error HTTP 404 Not Found.
func NewNotFound(message string) *ResponseError
Penggunaan:
user, err := repository.GetById(id)
if err != nil {
return helpers.NewNotFound("User not found")
}
Response:
{
"code": 404,
"status": false,
"message": "User not found"
}
NewInternalError
Membuat error HTTP 500 Internal Server Error.
func NewInternalError(message string) *ResponseError
Penggunaan:
if err := db.Save(model); err != nil {
return helpers.NewInternalError("Failed to save data")
}
Response:
{
"code": 500,
"status": false,
"message": "Failed to save data"
}
Usage dengan SendError
func CreateUser(ctx *gin.Context) {
var req dto.UserCreateRequest
// Binding error
if err := ctx.ShouldBindJSON(&req); err != nil {
helpers.SendError(ctx, helpers.NewBadRequest("Invalid request body"))
return
}
// Validation error
if req.Email == "" {
helpers.SendError(ctx, helpers.NewBadRequest("Email is required"))
return
}
// Business logic error
if exists := repository.CheckByEmail(req.Email); exists {
helpers.SendError(ctx, helpers.NewBadRequest("Email already registered"))
return
}
// Database error
if err := repository.Save(&user); err != nil {
helpers.SendError(ctx, helpers.NewInternalError("Failed to create user"))
return
}
// Success
ctx.JSON(http.StatusCreated, helpers.ResponseDataUpsert[models.User]{
Code: http.StatusCreated,
Status: true,
Message: "User created successfully",
Data: user,
})
}
HTTP Status Code Reference
| Status Code | Factory Function | Use Case |
|---|---|---|
| 400 | NewBadRequest | Invalid input, validation error |
| 401 | NewUnauthorized | Authentication failed, invalid token |
| 404 | NewNotFound | Resource not found |
| 500 | NewInternalError | Server error, database error |
Best Practices
-
Gunakan Factory Function yang Sesuai
// ✅ Correct
helpers.NewNotFound("User not found")
// ❌ Incorrect
helpers.NewBadRequest("User not found") -
Message yang Informatif
// ✅ Good
helpers.NewNotFound(fmt.Sprintf("User with ID %s not found", id))
// ❌ Avoid
helpers.NewNotFound("Not found") -
Jangan Expose Internal Error ke Client
// ✅ Good - Generic message ke client, log detail ke server
logger.Errorf("Database error: %v", err)
helpers.NewInternalError("Failed to process request")
// ❌ Avoid - Expose database error
helpers.NewInternalError(err.Error())