Проверяет понимание области действия recover и механизма паник в Go, а также изоляции горутин.
В Go каждая горутина выполняется независимо и имеет собственный стек вызовов. Паника — это механизм, который разворачивает стек вызовов внутри одной горутины, вызывая отложенные функции (defer) до тех пор, пока не будет вызван recover или программа не завершится. Поскольку стек вызовов изолирован, recover в одной горутине не может перехватить панику из другой.
package main
import (
"fmt"
"time"
)
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in main:", r)
}
}()
go func() {
panic("panic in goroutine")
}()
time.Sleep(time.Second)
fmt.Println("Main continues")
}В этом примере паника в горутине не будет перехвачена recover в main, и программа завершится с ошибкой. Чтобы обработать панику, нужно поместить recover внутрь той же горутины:
go func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in goroutine:", r)
}
}()
panic("panic in goroutine")
}()Recover работает только в пределах одной горутины. Для безопасной обработки паник в конкурентном коде необходимо добавлять defer/recover в каждую горутину, где возможна паника.