跳至主要内容
版本:v2.x

🐛 错误处理

捕捉错误

确保 Fiber 捕捉到在运行路由处理程序和中间件时发生的全部错误至关重要。你必须将它们返回到处理程序函数,Fiber 会在那里捕捉并处理它们。

app.Get("/", func(c *fiber.Ctx) error {
// Pass error to Fiber
return c.SendFile("file-does-not-exist")
})

默认情况下,Fiber 不会处理 panic。要从堆栈中任何处理程序抛出的 panic 中恢复,你需要包含下面的 Recover 中间件

示例
package main

import (
"log"

"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 Service Unavailable
return fiber.ErrServiceUnavailable

// 503 On vacation!
return fiber.NewError(fiber.StatusServiceUnavailable, "On vacation!")
})

默认错误处理程序

Fiber 默认提供一个错误处理程序。对于标准错误,响应将发送为 500 内部服务器错误。如果错误的类型为 fiber.Error,则响应将使用提供的状态代码和消息发送。

示例
// Default error handler
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
// Status code defaults to 500
code := fiber.StatusInternalServerError

// Retrieve the custom status code if it's a *fiber.Error
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}

// Set Content-Type: text/plain; charset=utf-8
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)

// Return status code with error message
return c.Status(code).SendString(err.Error())
}

自定义错误处理程序

在初始化Fiber 实例时,可以使用Config 设置自定义错误处理程序。

在大多数情况下,默认错误处理程序应该足够了。但是,如果你想捕获不同类型的错误并采取相应的措施,例如发送通知电子邮件或将错误记录到集中式系统,那么自定义错误处理程序会派上用场。你还可以向客户端发送自定义响应,例如错误页面或仅 JSON 响应。

以下示例展示了如何为不同类型的错误显示错误页面。

示例
// Create a new fiber instance with custom config
app := fiber.New(fiber.Config{
// Override default error handler
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
// Status code defaults to 500
code := fiber.StatusInternalServerError

// Retrieve the custom status code if it's a *fiber.Error
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}

// Send custom error page
err = ctx.Status(code).SendFile(fmt.Sprintf("./%d.html", code))
if err != nil {
// In case the SendFile fails
return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
}

// Return from handler
return nil
},
})

// ...

特别感谢EchoExpress框架在错误处理方面的启发。