لغة Go بالأمثلة: الاستعادة (recover)

تتيح Go الاستعادة من panic باستخدام الدالة المدمجة recover. يمكن لـrecover منع panic من إنهاء البرنامج، والسماح له بمتابعة التنفيذ بدلًا من ذلك.

مثال على موضع فائدة ذلك: لا يريد الخادم أن يتعطل إذا حدث خطأ حرج في أحد اتصالات العملاء، بل يريد إغلاق ذلك الاتصال ومواصلة خدمة العملاء الآخرين. وهذا ما تفعله net/http في Go افتراضيًا لخوادم HTTP.

package main
import "fmt"

تستدعي هذه الدالة panic.

func mayPanic() {
    panic("a problem")
}

يجب استدعاء recover داخل دالة مؤجلة. عندما تستدعي الدالة المحيطة panic، ستُنفذ الدالة المؤجلة ويلتقط استدعاء recover داخلها حالة panic.

func main() {

قيمة إرجاع recover هي الخطأ الذي أُطلق في استدعاء panic.

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered. Error:\n", r)
        }
    }()
    mayPanic()

لن يعمل هذا الكود، لأن mayPanic تستدعي panic. يتوقف تنفيذ main عند موضع panic، ويُستأنف داخل الإغلاق المؤجل.

    fmt.Println("After mayPanic()")
}
$ go run recover.go
Recovered. Error:
 a problem

المثال التالي: .