تخطَّ إلى المحتوى

panic

إيقاف التنفيذ الفوري panic

panic تُوقف التنفيذ الطبيعي للدالة الحالية فورًا وتبدأ سلسلة عودة عبر كل دالة مستدعية، منفّذة أي defer بالطريق، حتى تُلتقط بـ recover أو ينتهي البرنامج.

استدعاء panic يوقف تنفيذ الدالة الحالية فورًا. أي دوال مؤجَّلة بـ defer فيها تُنفَّذ كالمعتاد، ثم تعود الدالة لمستدعيها الذي يتصرّف كأنه هو نفسه استدعى panic، فينهي تنفيذه بدوره وينفّذ deferها، وهكذا تستمر السلسلة صعودًا عبر كل الدوال المستدعية بترتيب عكسي حتى تتوقف الـ goroutine كاملة. إن لم تُلتقط بـ recover في أي نقطة بالطريق، ينتهي البرنامج كاملًا بكود خروج غير صفري.

منذ Go 1.21، استدعاء panic بقيمة nil صريحة يسبّب خطأ وقت تشغيل مختلف بدل تمرير nil كما هي.

الصياغة

panic(v any)

📄 مثال

func safeDivide(a, b int) int {
  if b == 0 {
    panic("القسمة على صفر غير مسموحة")
  }
  return a / b
}

safeDivide(10, 0)   // panic: القسمة على صفر غير مسموحة

أهم النقاط

العنصرالوظيفة
panic(msg)يوقف التنفيذ الحالي وينفّذ كل defer بالطريق صعودًا
panic(err)شائع تمرير قيمة error بدل نص عادي لسياق أوضح

💡 نصائح عملية

  • اصطلاح Go: أعِد error من الدالة بدل panic لمعظم الحالات — استخدم panic فقط لأخطاء برمجية حقًا غير متوقّعة
  • لا تستخدم panic كبديل لمعالجة أخطاء عادية متوقّعة مثل عدم وجود ملف — استخدم قيمة error

⚠️ أخطاء شائعة

  • استخدام panic/recover كآلية تدفّق تحكّم عادية شبيهة بالاستثناءات في لغات أخرى — يخالف اصطلاح Go ويصعّب تتبّع الكود
  • نسيان أن panic بدون recover في أي مكان بالسلسلة ينهي البرنامج بالكامل، لا الدالة الحالية فقط

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار GO الكامل بالعربي.