一架梯子,一头程序猿,仰望星空!
Go Fiber教程 > 内容正文

Go Fiber错误处理


捕获错误

确保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
    },
})

// ...