การจัดการข้อผิดพลาด

การดูแลให้ Fiber จับข้อผิดพลาดทั้งหมดที่เกิดขึ้นขณะที่กำลังประมวลผล handler ของเส้นทางและ middleware เป็นสิ่งสำคัญ คุณต้องส่งข้อผิดพลาดนั้นกลับไปยังฟังก์ชัน handler เพื่อให้ Fiber จับและประมวลผลข้อผิดพลาดเหล่านั้น

  • ตัวอย่าง
app.Get("/", func(c *fiber.Ctx) error {
    // ส่งข้อผิดพลาดไปยัง Fiber
    return c.SendFile("file-does-not-exist")
})

โดยค่าเริ่มต้นเมื่อใดๆ Fiber จะไม่จัดการกับข้อผิดพลาดแบบ panic ใดๆ ในการกำหนดเพื่อกู้คืนจากการ panic ที่ถูกโยนมาโดย handler ใน stack และหลีกเลี่ยงการล่มของโปรแกรม Go คุณจะต้องรวม middleware Recover ตามที่แสดงไว้ด้านล่างนี้

  • ตัวอย่าง
package main

import (
    "log"

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

func main() {
    app := fiber.New()
	
	// ใช้ middleware recover เพื่อจับข้อผิดพลาดแบบ panic
    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() เพื่อส่ง status codes พิเศษได้ การโยนข้อความนั้นเป็นเรื่องทางลักษณะหรือไม่ก็ได้ ถ้าปล่อยว่างไว้ มันจะถูกกำหนดเป็นข้อความของ status code (ตัวอย่างเช่น 404 เท่ากับ Not Found)

  • ตัวอย่าง
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 Internal Server Error ถ้าประเภทของข้อผิดพลาดเป็น fiber.Error การตอบกลับจะถูกส่งโดยใช้ status code และข้อความที่ให้มา

  • ตัวอย่าง
// ตัวจัดการข้อผิดพลาดเริ่มต้น
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
    // ค่า status code เริ่มต้นคือ 500
    code := fiber.StatusInternalServerError

    // ถ้าเป็น *fiber.Error ให้ดึง status code ที่กำหนดเอง
    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)

    // ส่ง status code และข้อความข้อผิดพลาด
    return c.Status(code).SendString(err.Error())
}

ตัวจัดการข้อผิดพลาดที่กำหนดเอง

คุณสามารถกำหนดตัวจัดการข้อผิดพลาดที่กำหนดเองเมื่อกำลังเริ่มต้นอินสแตนซ์ของ Fiber โดยใช้ Config

ในกรณีส่วนใหญ่ตัวจัดการข้อผิดพลาดเริ่มต้นนั้นควรจะเพียงพอ แต่ถ้าคุณต้องการจับข้อผิดพลาดชนิดต่างๆ และดำเนินการที่เกี่ยวข้องเช่น การส่งอีเมลแจ้งเตือนหรือบันทึกข้อผิดพลาดไปยังระบบที่รวมกัน แล้วตัวจัดการข้อผิดพลาดที่กำหนดเองนั้นจะเป็นประโยชน์มากมาย คุณยังสามารถส่งตอบกลับที่กำหนดเองให้กับไคลเอ้นได้ เช่น หน้าข้อผิดพลาดหรือเพียงตอบกลับเป็น JSON

ตัวอย่างต่อไปนี้แสดงวิธีแสดงหน้าข้อผิดพลาดสำหรับประเภทข้อผิดพลาดต่างๆ

  • ตัวอย่าง
// สร้างอินสแตนซ์ใหม่ของ Fiber พร้อมกับการกำหนดค่าที่กำหนดเอง
app := fiber.New(fiber.Config{
    // เปลี่ยนตัวจัดการข้อผิดพลาดเริ่มต้น
    ErrorHandler: func(ctx *fiber.Ctx, err error) error {
        // ค่า status code เริ่มต้นคือ 500
        code := fiber.StatusInternalServerError

        // ถ้าเป็น *fiber.Error ให้ดึง status code ที่กำหนดเอง
        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")
        }

        // ส่งกลับจาก handler
        return nil
    },
})

// ...