AzLearn

أنماط الأخطاء المتقدمة

Advanced Error Patterns

مفهوم ~20 دقيقة

أنماط الأخطاء المتقدمة — Advanced Error Patterns

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

الأخطاء الحارسة — Sentinel Errors

أخطاء مُعرّفة كمتغيرات على مستوى الحزمة، تُستخدم للمقارنة:

main.go

أنواع أخطاء مخصصة — Custom Error Types

عندما تحتاج أن يحمل الخطأ بيانات إضافية:

main.go

errors.Is vs errors.As

errors.Is(err, target) — يفحص هل الخطأ (أو أي خطأ مُغلّف داخله) يساوي target errors.As(err, &target) — يبحث عن خطأ من نوع معين ويُحوّله

// errors.Is — مقارنة بقيمة — Compare by value
if errors.Is(err, ErrNotFound) { ... }

// errors.As — مقارنة بنوع — Compare by type
var ve *ValidationError
if errors.As(err, &ve) {
    // ve الآن يحتوي بيانات الخطأ
    fmt.Println(ve.Field)
}

panic و recover

panic يوقف البرنامج فوراً. recover يلتقط panic ويمنع الانهيار. استخدمهما بحذر شديد!

main.go

متى تستخدم كل نمط؟

الأداةمتى تُستخدم
errors.Newخطأ بسيط بدون بيانات
fmt.Errorfخطأ مع سياق أو تغليف
Custom typeخطأ يحمل بيانات إضافية
Sentinelخطأ معروف يُقارن مباشرة
panicحالة مستحيلة (bug في البرنامج)
recoverخوادم HTTP (لا تريد أن يتوقف الخادم بسبب طلب واحد)

القاعدة الأهم: panic ليس بديلاً لمعالجة الأخطاء! استخدمه فقط للحالات المستحيلة منطقياً (مثل index خارج النطاق في كود يجب أن يكون صحيحاً).

نمط Must

تجد أحياناً دوال بادئة بـ Must — هذه تستدعي panic عند الخطأ:

main.go

تذكّر: Must تُستخدم فقط عند التهيئة (initialization) — في main أو init أو على مستوى الحزمة — وليس في كود يعمل أثناء تشغيل البرنامج.

تحدي — Challenge