تجعل Go من الممكن الاسترداد (recover) من حالة ذعر (panic)، باستخدام دالة recover المدمجة. يمكن لـ recover إيقاف الـ panic من إنهاء البرنامج والسماح له بمواصلة التنفيذ بدلاً من ذلك.
مثال على الحالات التي يكون فيها هذا مفيداً: خادم الويب لا يريد الانهيار إذا أظهر أحد اتصالات العملاء خطأً فادحاً. بدلاً من ذلك، سيرغب الخادم في إغلاق ذلك الاتصال ومواصلة خدمة العملاء الآخرين. في الواقع، هذا ما تفعله حزمة net/http في Go بشكل افتراضي لخوادم HTTP.
package main
import "fmt"
هذه دالة تسبب ذعراً (panic).
func mayPanic() {
panic("مشكلة ما حدثت")
}
func main() {
يجب استدعاء recover داخل دالة مؤجلة (deferred function). عندما تذعر الدالة المحيطة، سيتم تنشيط defer وسيقوم استدعاء recover بداخلها بالتقاط الذعر.
defer func() {
قيمة الإرجاع لـ recover هي الخطأ الذي أثير في استدعاء panic.
if r := recover(); r != nil {
fmt.Println("تم الاسترداد. الخطأ:\n", r)
}
}()
mayPanic()
هذا الكود لن يعمل، لأن mayPanic تسبب ذعراً. تنفيذ main يتوقف عند نقطة الذعر ويستأنف في الإغلاق المؤجل.
fmt.Println("بعد mayPanic()")
}
تشغيل البرنامج:
$ go run recover.go
تم الاسترداد. الخطأ:
مشكلة ما حدثت المثال التالي: دوال النصوص (String Functions).