戈朗。获取恐慌类型

Golang. Get panic type

有一个代码:

func (c *Connector) SendPacketFuture(p []byte) (future chan []byte) {
    defer func() {
        // TODO Check r to catch only chan panics
        if r := recover(); r != nil {
            future = nil
        }
    }()
    t := newConnectorTask(p)
    c.tasks <- t
    future = t.PacketFromServerChan
    return
}

TODO 是不言自明的。 c.tasks 是一个通道,它可以被另一个 goroutine 关闭。由于没有安全的方式发送到可以关闭的频道,我在这里感到恐慌。问题是可能会发生不同的恐慌,我想对通过写入已关闭的 chan 引发的恐慌做出反应。

在 Go 中可以做到这一点吗?

本例中的恢复消息是未从运行时导出的错误值,字符串值为 "send on closed channel"

你在这里唯一能做的就是匹配错误字符串:

if e, ok := r.(error); ok && w.Error() == "send on closed channel" {
    fmt.Println("recover from send on closed channel")
}

https://play.golang.org/p/LNcfdE9Bg2

实际上,您可能需要一个单独的通道来发出退出信号。

t := newConnectorTask(p)

select {
case <-c.close:
    // closing the c.close channel will unblock this case
    return
case c.tasks <- t:
}