Golang。得到恐慌类型

时间:2016-10-04 22:09:47

标签: go channel panic

有一个代码:

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关闭。由于没有安全的方式发送到可以关闭的频道,我在这里捕捉恐慌。问题在于可能会发生不同的恐慌,并且我想通过写入已关闭的陈来对所引发的恐慌作出反应。

是否可以在Go中执行此操作?

1 个答案:

答案 0 :(得分:1)

在这种情况下,恢复消息是运行时的未导出错误值,字符串值为"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:
}