【问题标题】:Golang: Cannot send error to channel in recover()Golang:无法在恢复()中向通道发送错误
【发布时间】:2021-12-11 03:04:24
【问题描述】:

我尝试在恢复时在频道中发送错误 为什么这个错误没有发送到频道?

package main

import (
    "fmt"
    "sync"
    "errors"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    batchErrChan := make(chan error)
    
    go func(errchan chan error) {
       defer func() {
         if r := recover(); r != nil {
            errchan <- errors.New("recover err")
         }
         close(batchErrChan)
         wg.Done()
       }()

       panic("ddd")
    }(batchErrChan)

    go func() {
       for _ = range batchErrChan {
         fmt.Println("err in range")
       }
    }()
    
    wg.Wait()
}

https://play.golang.org/p/0ytunuYDWZU

我希望打印“范围内的错误”,但事实并非如此。为什么?

【问题讨论】:

    标签: go channel


    【解决方案1】:

    你的程序在 goroutine 有机会打印消息之前结束。尝试等待它:

            ...
            done:=make(chan struct{})
            go func() {
             for _ = range batchErrChan {
                fmt.Println("err in range")
             }
             close(done)
           }()
        
           wg.Wait()
           <-done
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-21
      • 2021-06-15
      • 1970-01-01
      • 2021-01-03
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 2023-04-09
      相关资源
      最近更新 更多