معالجة الأخطاء

ضمان أن يُلتقط Fiber جميع الأخطاء التي تحدث أثناء تشغيل معالجي الطرق والوسيطات أمر بالغ الأهمية. يجب عليك إعادتها إلى دالة المعالج ليُلتقطها Fiber ويقوم بمعالجتها.

  • مثال
app.Get("/", func(c *fiber.Ctx) error {
    // إعادة الخطأ إلى Fiber
    return c.SendFile("file-does-not-exist")
})

بشكل افتراضي، لا يتعامل Fiber مع أخطاء الانهيار. يجب عليك استخدام وسيط Recover للاسترداد من أي انهيار يتم طرحه بواسطة معالجين في الستاك وتجنب تعطل برنامج Go، كما هو موضح أدناه:

  • مثال
package main

import (
    "log"

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

func main() {
    app := fiber.New()
	
	// استخدام وسيط الاسترداد للتقاط أخطاء الانهيار
    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() لتمرير أكواد حالة إضافية. تمرير الرسالة أمر اختياري؛ إذا تركت فارغة، فسيتم الافتراضي إلى رسالة الكود الحالة (على سبيل المثال، 404 يساوي Not Found).

  • مثال
app.Get("/", func(c *fiber.Ctx) error {
    // 503 الخدمة غير متوفرة
    return fiber.ErrServiceUnavailable

    // 503 في إجازة!
    return fiber.NewError(fiber.StatusServiceUnavailable, "في إجازة!")
})

معالج الخطأ الافتراضي

يوفر Fiber معالج خطأ افتراضي. بالنسبة للأخطاء القياسية، سيتم إرسال الاستجابة بوصف 500 Internal Server Error. إذا كان نوع الخطأ هو 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("Internal Server Error")
        }

        // العودة من المعالج
        return nil
    },
})

// ...