Sobes.tech
Назад к вопросам
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)
        // обработка ошибки
    }
}

Таким образом, паника обрабатывается в дочерней горутине, а родитель получает уведомление и может реагировать.