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

// ...