Error Handling
Kruda provides structured error handling with error mapping, custom error types, and dev mode error pages.
KrudaError
The built-in error type for HTTP errors:
go
err := kruda.NewError(404, "User not found")
err := kruda.NewError(422, "Validation failed", wrappedErr)Return errors from handlers:
go
app.Get("/users/:id", func(c *kruda.Ctx) error {
user, err := findUser(c.Param("id"))
if err != nil {
return kruda.NewError(404, "User not found")
}
return c.JSON(user)
})Error response format:
json
{
"message": "User not found",
"code": 404
}Error Mapping
Map domain errors to HTTP responses without cluttering handler logic:
MapError — Map Specific Errors (method on App)
go
var ErrNotFound = errors.New("not found")
var ErrForbidden = errors.New("forbidden")
app.MapError(ErrNotFound, 404, "Resource not found")
app.MapError(ErrForbidden, 403, "Access denied")Now handlers can return domain errors directly:
go
app.Get("/users/:id", func(c *kruda.Ctx) error {
user, err := repo.FindByID(c.Param("id"))
if err != nil {
return err // ErrNotFound → 404 automatically
}
return c.JSON(user)
})MapErrorType — Map Error Types (package-level generic function)
go
kruda.MapErrorType[*ValidationError](app, 422, "Validation failed")Note: This is a generic package-level function, not a method on App.
MapErrorFunc — Custom Error Mapping (package-level function)
go
kruda.MapErrorFunc(app, ErrDatabase, func(err error) *kruda.KrudaError {
var pgErr *pgconn.PgError
if errors.As(err, &pgErr) {
if pgErr.Code == "23505" { // unique violation
return kruda.NewError(409, "Resource already exists")
}
}
return nil // not handled, pass to next mapper
})Custom Error Handler
Override the default error handler:
go
app := kruda.New(kruda.WithErrorHandler(func(c *kruda.Ctx, err *kruda.KrudaError) {
c.Status(err.Code).JSON(map[string]any{
"error": err.Message,
"requestId": c.Header("X-Request-ID"),
})
}))Note: WithErrorHandler receives *KrudaError (not error).
Dev Mode Error Page
In development mode, errors render as a rich HTML page with source code context, stack trace, and request details:
go
app := kruda.New(kruda.WithDevMode(true))The dev error page includes:
- Error message and type
- Source code ±10 lines around the error
- Stack trace with file paths
- Request details (method, path, headers, query)
- Available routes table
- Filtered environment variables
Dev mode is never active in production. Enable it explicitly or via KRUDA_ENV=development.
See Error API for the full reference.
