捕获错误
确保Fiber在运行路由处理程序和中间件时捕获所有发生的错误是非常重要的。你必须将它们返回给处理程序函数,Fiber将捕获并处理它们。
- 示例
app.Get("/", func(c *fiber.Ctx) error {
// 将错误传递给Fiber
return c.SendFile("file-does-not-exist")
})
Fiber默认不处理painc错误。要从堆栈中的任何处理程序抛出的painc中恢复,避免go程序崩溃,您需要在下面包含Recover
中间件:
- 示例
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
// 引用recover中间件,拦截painc错误
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
panic("This panic is caught by fiber")
})
log.Fatal(app.Listen(":3000"))
}
您可以使用Fiber的自定义错误结构使用fiber.NewError()
传递额外的状态码
。传递消息是可选的;如果留空,这将默认为状态码消息(404
等于Not Found
)。
- 示例
app.Get("/", func(c *fiber.Ctx) error {
// 503 服务不可用
return fiber.ErrServiceUnavailable
// 503 度假中!
return fiber.NewError(fiber.StatusServiceUnavailable, "度假中!")
})
默认错误处理程序
Fiber默认提供错误处理程序。对于标准错误,响应会被发送为500 Internal Server Error。如果错误类型为fiber.Error,响应会使用提供的状态码和消息进行发送。
- 示例
// 默认错误处理程序
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
// 状态码默认为500
code := fiber.StatusInternalServerError
// 如果是*fiber.Error,则检索自定义状态码
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
// 设置Content-Type: text/plain; charset=utf-8
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
// 返回状态码和错误消息
return c.Status(code).SendString(err.Error())
}
自定义错误处理程序
可以使用Config在初始化Fiber实例时设置自定义错误处理程序。
在大多数情况下,默认的错误处理程序应该足够使用。然而,如果您想捕获不同类型的错误并采取相应的操作,例如发送通知邮件或将错误记录到集中式系统中,那么自定义错误处理程序会非常有用。您还可以向客户端发送自定义响应,例如错误页面或只是一个JSON响应。
以下示例显示如何显示不同类型错误的错误页面。
- 示例
// 使用自定义配置创建新的Fiber实例
app := fiber.New(fiber.Config{
// 覆盖默认的错误处理程序
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
// 状态码默认为500
code := fiber.StatusInternalServerError
// 如果是*fiber.Error,则检索自定义状态码
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
// 发送自定义错误页面
err = ctx.Status(code).SendFile(fmt.Sprintf("./%d.html", code))
if err != nil {
// 如果SendFile失败
return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
}
// 从处理程序返回
return nil
},
})
// ...