التعامل مع الذعر في Go Routines
يوفر Go الذعر () والاسترداد () المدمجين لإدارة الأخطاء غير المتوقعة والظروف القاتلة في رمز التشغيل. للتعامل مع حالات الذعر في روتين التنقل، من الضروري فهم نطاق الاسترداد ().
فهم الاسترداد () النطاق
لا يمكن استرداد () التعافي إلا من حالات الذعر ضمن نفس goroutine الذي أثار الذعر. إذا حدث ذعر في goroutine بدون استرداد نشط ()، فسوف يتعطل البرنامج بأكمله.
مثال على معالجة الأخطاء غير الصحيحة
مثال التعليمات البرمجية المقدم في السؤال يفشل في التعامل مع حالة الذعر لأن الاسترداد () محدد في الروتين الرئيسي، بينما يتم رفع حالة الذعر في جوروتين المقبض (). ونتيجة لذلك، لا يمكن لـrecover() الوصول إلى قيمة الذعر.func main() { // ... اذهب مقبض (تم) // ... } مقبض func (تم تشان int64) { // ... fmt.Println(*a) // الذعر هنا تم func main() { // ... go handle(done) // ... } func handle(done chan int64) { // ... fmt.Println(*a) // Panic here doneمثال على المعالجة الصحيحة للأخطاء
للتعامل مع حالات الذعر التي أثيرت في goroutine، ضع Recover() داخل goroutine نفسه.func main () { // ... تأجيل الوظيفة () { إذا ص := استرداد()؛ ص! = لا شيء { fmt.Println("تم الاسترداد") } }() اذهب مقبض (تم) // ... } مقبض func (تم تشان int64) { // ... تأجيل الوظيفة () { إذا ص := استرداد()؛ ص! = لا شيء { fmt.Println("تم الاسترداد") } }() fmt.Println(*a) // الذعر هنا تم func main() { // ... defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() go handle(done) // ... } func handle(done chan int64) { // ... defer func() { if r := recover(); r != nil { fmt.Println("Recovered") } }() fmt.Println(*a) // Panic here done
شرح
في هذا المثال المصحح، أصبح Recovery() الآن ضمن روتين المقبض()، حتى يتمكن من التقاط الذعر الناتج عن إلغاء الإشارة إلى مؤشر الصفر. يتم بعد ذلك استرداد حالة الذعر، وتتم طباعة الرسالة "تم الاسترداد".يعد فهم نطاق الاسترداد () أمرًا بالغ الأهمية لمعالجة الأخطاء بشكل فعال في إجراءات Go. قم دائمًا بوضع الاسترداد () داخل نفس الإجراء الذي يمكن أن يحدث فيه الذعر للتعامل مع أي ظروف غير متوقعة والإبلاغ عنها بأمان.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3