Назад к вопросам
Junior — Middle
77
Можно ли реализовать обработку паники внутри дочерней горутины так, чтобы она влияло на родительскую горутину?
Компании, где спрашивали
Самокат Тех
Ответ от нейросети
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)
// обработка ошибки
}
}
Таким образом, паника обрабатывается в дочерней горутине, а родитель получает уведомление и может реагировать.