Fiber 的错误模型很舒服:
handler 和 middleware 返回 error,交给统一事故中心处理。
app.Get("/file", func(c fiber.Ctx) error {
return c.SendFile("./not-exist.txt")
})这里如果出错,不是你每个 handler 自己 fmt.Println 一通,而是走 Fiber 的统一错误通路。
#1. panic 默认不会自动兜住
Fiber 官方 Error Handling 文档特别强调:
Fiber 默认不会自动 recover panic。
所以你要显式加:
import recoverer "github.com/gofiber/fiber/v3/middleware/recover"
app.Use(recoverer.New())如果没有这道“事故缓冲护栏”,某个 handler panic,你就可能直接出严重问题。
#2. 自定义 ErrorHandler 才是真实项目的标配
app := fiber.New(fiber.Config{
ErrorHandler: func(c fiber.Ctx, err error) error {
code := fiber.StatusInternalServerError
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
return c.Status(code).JSON(fiber.Map{
"code": code,
"message": err.Error(),
})
},
})这就相当于你在快线城区里建了一个统一事故中心:
- 先判断事故等级
- 再决定对外口径
- 再统一输出回执
这样你的 handler 就能干净很多:
app.Get("/users/:id", func(c fiber.Ctx) error {
id := c.Params("id")
if id == "0" {
return fiber.NewError(fiber.StatusBadRequest, "invalid id")
}
return c.JSON(fiber.Map{"id": id})
})