การจัดการข้อผิดพลาด
การดูแลให้ 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
},
})
// ...