戈朗。获取恐慌类型
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:
}
有一个代码:
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:
}