Back to questions
Junior — Middle
80
Можно ли реализовать обработку паники внутри дочерней горутины так, чтобы она влияло на родительскую горутину?
Companies where asked
Самокат Тех
Answer from AI
sobes.tech AI
В Go паника внутри дочерней горутины не влияет напрямую на родительскую горутину, так как каждая горутина работает независимо. Обработать панику внутри дочерней горутины можно с помощью recover(), но это локально — она не передаст ошибку автоматически родителю.
Если нужно, чтобы родитель узнал о панике дочерней горутины, обычно делают так:
- В дочерней горутине используют
deferсrecover()для перехвата паники. - После перехвата паники отправляют информацию об ошибке через канал (channel) родителю.
- Родительская горутина читает из канала и принимает решение, например, завершить работу или обработать ошибку.
Пример:
func child(ch chan<- error) {
defer func() {
if r := recover(); r != nil {
ch <- fmt.Errorf("panic: %v", r)
}
}()
// код, который может вызвать панику
panic("something went wrong")
}
func parent() {
ch := make(chan error)
go child(ch)
err := <-ch
if err != nil {
fmt.Println("Child goroutine panicked:", err)
// обработка ошибки
}
}
Таким образом, паника обрабатывается в дочерней горутине, а родитель получает уведомление и может реагировать.