أنماط الأخطاء المتقدمة
Advanced Error Patterns
أنماط الأخطاء المتقدمة — Advanced Error Patterns
بعد فهم الأساسيات، حان وقت الأنماط المتقدمة. هذه الأنماط تُستخدم في المشاريع الكبيرة حيث تحتاج تصنيف الأخطاء والتعامل مع كل نوع بشكل مختلف.
الأخطاء الحارسة — Sentinel Errors
أخطاء مُعرّفة كمتغيرات على مستوى الحزمة، تُستخدم للمقارنة:
أنواع أخطاء مخصصة — Custom Error Types
عندما تحتاج أن يحمل الخطأ بيانات إضافية:
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 ويمنع الانهيار. استخدمهما بحذر شديد!
متى تستخدم كل نمط؟
| الأداة | متى تُستخدم |
|---|---|
errors.New | خطأ بسيط بدون بيانات |
fmt.Errorf | خطأ مع سياق أو تغليف |
| Custom type | خطأ يحمل بيانات إضافية |
| Sentinel | خطأ معروف يُقارن مباشرة |
panic | حالة مستحيلة (bug في البرنامج) |
recover | خوادم HTTP (لا تريد أن يتوقف الخادم بسبب طلب واحد) |
القاعدة الأهم: panic ليس بديلاً لمعالجة الأخطاء! استخدمه فقط للحالات المستحيلة منطقياً (مثل index خارج النطاق في كود يجب أن يكون صحيحاً).
نمط Must
تجد أحياناً دوال بادئة بـ Must — هذه تستدعي panic عند الخطأ:
تذكّر:
Mustتُستخدم فقط عند التهيئة (initialization) — فيmainأوinitأو على مستوى الحزمة — وليس في كود يعمل أثناء تشغيل البرنامج.