Ответ
Да, можно, но не напрямую. Паника в дочерней горутине не распространяется автоматически в родительскую. Однако есть несколько способов:
- Использование defer/recover в дочерней горутине:
go func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in child goroutine:", r)
}
}()
panic("something bad happened")
}()
- Через канал для передачи ошибок:
errCh := make(chan error)
go func() {
defer func() {
if r := recover(); r != nil {
errCh <- fmt.Errorf("panic occurred: %v", r)
}
}()
// работа горутины
errCh <- nil
}()
if err := <-errCh; err != nil {
// обработка ошибки
}
Важно помнить, что recover работает только в той же горутине, где произошла паника. Для надежной обработки ошибок лучше использовать каналы или другие механизмы синхронизации.