错误处理
🐛 错误处理
Fiber支持集中的错误处理,通过向处理程序返回错误,允许你将错误记录到外部服务或向客户端发送自定义的HTTP响应。
捕捉错误
必须确保Fiber在运行路由处理程序和中间件时能捕捉到所有的错误。你必须把它们返回到处理程序函数中,Fiber将在那里捕捉和处理它们。
app.Get("/", func(c *fiber.Ctx) error {
// 将错误传递给Fiber
return c.SendFile("file-does-not-exist")
})
Fiber默认不处理panics。要从堆栈中任何处理程序抛出的恐慌中恢复,你需要包括下面的Recover
中间件。
示例:
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
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
等于`未找到')。
示例:
app.Get("/", func(c *fiber.Ctx) error {
// 503服务不可用
return fiber.ErrServiceUnavailable
// 503 正在休假!
return fiber.NewError(fiber.StatusServiceUnavailable, "On vacation!")
})
默认的错误处理程序
Fiber默认提供一个错误处理程序。对于一个标准错误,响应被发送为500内部服务器错误。如果错误是fiber.Error类型的,则以提供的状态码和消息发送响应。
示例:
// 默认的错误处理程序
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
// 默认的500状态码
code := fiber.StatusInternalServerError
if e, ok := err.(*fiber.Error); ok {
// 覆盖状态代码,如果fiber.Error类型
code = e.Code
}
// 设置Content-Type: text/plain; charset=utf-8
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
// 返回带有错误信息的状态码
return c.Status(code).SendString(err.Error())
}
自定义错误处理程序
在初始化Fiber instance时,可以使用Config设置一个自定义错误处理程序。
在大多数情况下,默认的错误处理程序应该是足够的。然而,如果你想捕捉不同类型的错误并采取相应的行动,例如,发送通知邮件或向中央系统记录错误,自定义错误处理程序就会派上用场。你也可以向客户端发送自定义的响应,例如,错误页面或只是一个JSON响应。
下面的例子显示了如何为不同类型的错误显示错误页面。
示例:
// 创建一个具有自定义配置的新光纤实例
app := fiber.New(fiber.Config{
// 覆盖默认的错误处理程序
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
// 状态代码默认为500
code := fiber.StatusInternalServerError
// 如果是fiber.*Error,则检索自定义状态代码。
if e, ok := err.(*fiber.Error); ok {
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
},
})
// ...
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。