Xử lý Lỗi

Đảm bảo rằng Fiber bắt tất cả các lỗi xảy ra trong khi chạy các trình xử lý tuyến và middleware là rất quan trọng. Bạn phải trả về chúng cho hàm xử lý để Fiber có thể bắt và xử lý chúng.

  • Ví dụ
app.Get("/", func(c *fiber.Ctx) error {
    // Truyền lỗi cho Fiber
    return c.SendFile("file-does-not-exist")
})

Mặc định, Fiber không xử lý lỗi panic. Để phục hồi từ bất kỳ panic nào được ném bởi các trình xử lý trong ngăn xếp và tránh sự sụp đổ của chương trình Go, bạn cần bao gồm middleware Recover như dưới đây:

  • Ví dụ
package main

import (
    "log"

    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/recover"
)

func main() {
    app := fiber.New()
	
	// Sử dụng middleware recover để bắt lỗi panic
    app.Use(recover.New())

    app.Get("/", func(c *fiber.Ctx) error {
        panic("Lỗi panic này được bắt bởi fiber")
    })

    log.Fatal(app.Listen(":3000"))
}

Bạn có thể sử dụng cấu trúc lỗi tùy chỉnh của Fiber với fiber.NewError() để truyền các mã trạng thái bổ sung. Việc truyền một tin nhắn là tùy chọn; nếu để trống, nó sẽ mặc định thành tin nhắn mã trạng thái (ví dụ, 404 tương đương Không tìm thấy).

  • Ví dụ
app.Get("/", func(c *fiber.Ctx) error {
    // 503 Dịch vụ không khả dụng
    return fiber.ErrServiceUnavailable

    // 503 Đã đi nghỉ!
    return fiber.NewError(fiber.StatusServiceUnavailable, "Đã đi nghỉ!")
})

Trình Xử lý Lỗi Mặc Định

Fiber cung cấp một trình xử lý lỗi mặc định. Đối với các lỗi tiêu chuẩn, phản hồi sẽ được gửi dưới dạng 500 Lỗi Máy Chủ Nội Bộ. Nếu loại lỗi là fiber.Error, phản hồi sẽ được gửi bằng cách sử dụng mã trạng thái và tin nhắn được cung cấp.

  • Ví dụ
// Trình xử lý lỗi mặc định
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
    // Mã trạng thái mặc định là 500
    code := fiber.StatusInternalServerError

    // Nếu đó là *fiber.Error, trích xuất mã trạng thái tùy chỉnh
    var e *fiber.Error
    if errors.As(err, &e) {
        code = e.Code
    }

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

    // Trả về mã trạng thái và thông điệp lỗi
    return c.Status(code).SendString(err.Error())
}

Trình Xử lý Lỗi Tùy Chỉnh

Bạn có thể thiết lập một trình xử lý lỗi tùy chỉnh khi khởi tạo thể hiện Fiber bằng cách sử dụng Config.

Trong hầu hết các trường hợp, trình xử lý lỗi mặc định sẽ đủ. Tuy nhiên, nếu bạn muốn bắt các loại lỗi khác nhau và thực hiện các hành động tương ứng, như gửi email thông báo hoặc ghi lại các lỗi vào hệ thống trung tâm, thì một trình xử lý lỗi tùy chỉnh sẽ rất hữu ích. Bạn cũng có thể gửi phản hồi tùy chỉnh cho khách hàng, chẳng hạn như trang lỗi hoặc chỉ một phản hồi JSON.

Ví dụ dưới đây cho thấy cách hiển thị trang lỗi cho các loại lỗi khác nhau.

  • Ví dụ
// Tạo một thể hiện Fiber mới với cấu hình tùy chỉnh
app := fiber.New(fiber.Config{
    // Ghi đè trình xử lý lỗi mặc định
    ErrorHandler: func(ctx *fiber.Ctx, err error) error {
        // Mã trạng thái mặc định là 500
        code := fiber.StatusInternalServerError

        // Nếu đó là *fiber.Error, trích xuất mã trạng thái tùy chỉnh
        var e *fiber.Error
        if errors.As(err, &e) {
            code = e.Code
        }

        // Gửi một trang lỗi tùy chỉnh
        err = ctx.Status(code).SendFile(fmt.Sprintf("./%d.html", code))
        if err != nil {
            // Nếu SendFile thất bại
            return ctx.Status(fiber.StatusInternalServerError).SendString("Lỗi Máy Chủ Nội Bộ")
        }

        // Trả về từ trình xử lý
        return nil
    },
})

// ...