错误处理

未匹配的标注

🐛 错误处理

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

// ...

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

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/gofiber/2.x/err...

译文地址:https://learnku.com/docs/gofiber/2.x/err...

上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~