Error Handling
اطمینان از اینکه Fiber تمامی خطاهایی که در حال اجرا شدن هنگام اجرای دستگیرهها و میان افزارها رخ میدهد را گرفته، بسیار حیاتی است. شما باید این خطاها را به تابع دستگیره بازگردانید تا Fiber قادر باشد آنها را گرفته و پردازش کند.
- مثال
app.Get("/", func(c *fiber.Ctx) error {
// ارسال خطا به Fiber
return c.SendFile("file-does-not-exist")
})
بهطور پیشفرض، Fiber با خطاهای پنیک را بررسی نمیکند. برای بازیابی از هر خطای پنیک شده توسط دستگیرهها در پشته و جلوگیری از برنامه Go کرش کردن، شما باید میان افزار Recover
را به شکل زیر اضافه کنید:
- مثال
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
// استفاده از میان افزار recover برای گرفتن خطاهای پنیک
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
panic("این پنیک توسط 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, "در تعطیلی!")
})
دستگیره خطای پیشفرض
Fiber دستگیره خطای پیشفرضی فراهم میکند. برای خطاهای استاندارد، پاسخ به شکل 500 خطای داخلی سرور ارسال میشود. اگر نوع خطا 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())
}
دستگیره خطای سفارشی
میتوانید هنگام مقدماتی سازی نمونه Fiber از Config از دستگیره خطای سفارشی استفاده کنید.
در اکثر موارد، دستگیره خطای پیشفرض کافی خواهد بود. با این حال، اگر میخواهید انواع مختلف خطاها را گرفته و اقدامات مربوطه را انجام دهید، مانند ارسال ایمیلهای اطلاعیه یا ثبت خطاها در یک سیستم مرکزی، آنگاه دستگیره خطای سفارشی بسیار مفید خواهد بود. همچنین میتوانید پاسخهای سفارشی را به مشتری ارسال کنید، مانند صفحات خطا یا فقط یک پاسخ 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("خطای داخلی سرور")
}
// بازگشت از دستگیره
return nil
},
})
// ...