Τι είναι το πανικό στο Go και πότε δεν μπορεί να πιαστεί;
sobes.tech AI
Απάντηση από AI
Στη Go, το panic είναι ένας μηχανισμός που χρησιμοποιείται για την αντιμετώπιση κρίσιμων σφαλμάτων κατά την εκτέλεση του προγράμματος. Όταν καλείται η λειτουργία panic, η εκτέλεση του τρέχοντος goroutine διακόπτεται και ξεκινά η διαδικασία "αποσύνθεσης" της στοίβας (stack unwinding), κατά την οποία καλούνται οι καθυστερημένες (defer) συναρτήσεις.
Το panic μπορεί να πιαστεί με τη χρήση της λειτουργίας recover, η οποία πρέπει να καλείται μέσα σε μια καθυστερημένη (defer) συνάρτηση. Αν το recover καλείται εκτός μιας τέτοιας συνάρτησης, δεν θα μπορέσει να πιάσει το panic.
Ωστόσο, υπάρχουν καταστάσεις όπου το panic δεν μπορεί να πιαστεί:
- Αν το panic συμβεί στην κύρια goroutine και δεν πιαστεί, το πρόγραμμα θα τερματίσει απότομα.
- Αν το panic συμβεί σε κλήσεις συστήματος ή στο runtime, που δεν επιτρέπουν το recover.
- Αν το recover καλείται εκτός του πλαισίου μιας καθυστερημένης συνάρτησης, δεν θα μπορέσει να αποτρέψει το τερματισμό του προγράμματος.
Παράδειγμα:
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Πιάσαμε το panic:", r)
}
}()
panic("κάτι πήγε στραβά")
}
Σε αυτό το παράδειγμα, το panic θα πιαστεί και θα διαχειριστεί, και το πρόγραμμα δεν θα τερματίσει απότομα.