Skip to main content

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 CodeFactory FunctionUse Case
400NewBadRequestInvalid input, validation error
401NewUnauthorizedAuthentication failed, invalid token
404NewNotFoundResource not found
500NewInternalErrorServer error, database error

Best Practices

  1. Gunakan Factory Function yang Sesuai

    // ✅ Correct
    helpers.NewNotFound("User not found")

    // ❌ Incorrect
    helpers.NewBadRequest("User not found")
  2. Message yang Informatif

    // ✅ Good
    helpers.NewNotFound(fmt.Sprintf("User with ID %s not found", id))

    // ❌ Avoid
    helpers.NewNotFound("Not found")
  3. 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())