"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنني التعامل مع قيم الإرجاع الخاطئة من الوظائف المؤجلة في Go؟

كيف يمكنني التعامل مع قيم الإرجاع الخاطئة من الوظائف المؤجلة في Go؟

تم النشر بتاريخ 2024-11-03
تصفح:279

How can I handle erroneous return values from deferred functions in Go?

التعامل مع الوظائف المؤجلة مع قيم الإرجاع الخاطئة في Go

gometalinter و errcheck يثيران تحذيرًا بشكل صحيح عندما يتم تأجيل دالة تُرجع متغيرًا بدون التحقق من الخطأ الذي تم إرجاعه. يمكن أن يؤدي هذا إلى أخطاء لم تتم معالجتها ومشكلات محتملة في وقت التشغيل.

إن لغة التعامل مع هذا السيناريو لا تتمثل في تأجيل الوظيفة نفسها، بل في تغليفها في وظيفة أخرى تتحقق من القيمة التي تم إرجاعها. إليك مثال:

defer func() {
    if err := r.Body.Close(); err != nil {
        // Handle the error
    }
}()

باستخدام دالة مجهولة، يمكنك التقاط القيمة المرجعة للدالة المؤجلة ومعالجة أي أخطاء تحدث.

بدلاً من ذلك، يمكنك إنشاء دالة مساعدة لتبسيط العملية :

func Check(f func() error) {
    if err := f(); err != nil {
        // Handle the error
    }
}

يمكن بعد ذلك استخدام هذه الوظيفة المساعدة لتأجيل وظائف متعددة، مما يضمن التحقق من قيم الإرجاع الخاصة بها:

defer Check(r.Body.Close)
defer Check(SomeOtherFunc)

يمكنك أيضًا توسيع وظيفة المساعد لقبول وظائف متعددة:

func Checks(fs ...func() error) {
    for i := len(fs) - 1; i >= 0; i-- {
        if err := fs[i](); err != nil {
            // Handle the error
        }
    }
}

يسمح لك هذا بتأجيل وظائف متعددة ومعالجة أخطائها بطريقة أكثر إيجازًا وتنظيمًا:

defer Checks(r.Body.Close, SomeOtherFunc)

للتأكد من معالجة الأخطاء بالترتيب الصحيح، تستخدم الدالة Checks() حلقة تنازلية لتنفيذ الوظائف بترتيب عكسي لإعلانها. يتماشى هذا مع ترتيب تنفيذ الوظائف المؤجلة، حيث يتم تنفيذ آخر وظيفة مؤجلة أولاً.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3