🐹 شرح Go

معالجة الأخطاء (Errors)

فلسفة Go في الأخطاء

لا استثناءات للتدفّق العادي — الأخطاء قيم تُعاد وتُفحص صراحةً:

result, err := divide(10, 0)
if err != nil {
  fmt.Println("خطأ:", err)
  return
}
fmt.Println(result)

إنشاء خطأ

import "errors"

func validate(age int) error {
  if age < 0 {
    return errors.New("العمر سالب")
  }
  return nil
}

خطأ منسّق

return fmt.Errorf("المستخدم %d غير موجود", id)

تغليف الأخطاء (Wrapping)

if err != nil {
  return fmt.Errorf("فشل التحميل: %w", err)
}
// فحص لاحقًا
errors.Is(err, ErrNotFound)

أخطاء مخصّصة

type ValidationError struct {
  Field string
}
func (e *ValidationError) Error() string {
  return "حقل غير صالح: " + e.Field
}

panic و recover

panic لأخطاء غير قابلة للاسترداد، recover لالتقاطها:

func safe() {
  defer func() {
    if r := recover(); r != nil {
      fmt.Println("تعافٍ من:", r)
    }
  }()
  panic("خطأ فادح")
}

💡 الاصطلاح: أعِد الأخطاء بدل panic. استخدم panic للأخطاء البرمجية فقط.

🎯 التالي: التركيب والتضمين في البِنى.