Closed 15951836388 closed 6 years ago
你可以按你代码逻辑具体情况加入 recover,详细见:http://blog.golang.org/defer-panic-and-recover
我看leaf的timer和go和chanrpc里都已经处理了recover,为什么还要额外处理?
但是似乎只有通过proto消息调用的方法,出错不会全挂掉。其他不行,这是为什么?
你这个出错是panic了吧,那是代码逻辑有问题。正常业务数据怎么会panic掉,在timer里面调用defer skeleton.AfterFunc
,就能保证timer不会停掉
@karllynnn 是数据错了,panic了。但是我的测试,timer确实停了。不知道要怎么改,测试代码如下: 下面代码执行10次,分母就为0了,会panic,timer就停了。希望timer可以不停止。不能因为1个用户出错,所有用户都不处理了。比如类似 整体回蓝的功能,1个用户出错,所有的用户都不能回蓝了
type Player struct { mp int32 }
var ts []*Player
func test() { //这里加defer也没用 defer skeleton.AfterFunc(1*time.Millisecond, func() { for _, v := range ts { v.mp++ b := 5 / (v.mp - 10) log.Debug("ba", b, v.mp) } test() }) }
func init() {
for i := 0; i < 10; i++ {
ts = append(ts, &Player{mp: 0})
}
test()
}
如果用户代码出错了,错误是一定可以被 Leaf 捕获到的,Leaf timer 也是如此。
这个问题不在于 Leaf 的处理,而是你对代码没有正确理解(进一步来说,就是对 panic 的理解)。Leaf 的 timer 执行一次就结束了,然后用户通过再次调用 AfterFunc 再次创建 timer。像上面这个例子,真实情况不是“timer 停止”了,而是无法再次启用 timer,也就是 test 没有被调用。所以,需要在代码中保证无论有什么情况发生,都需要执行 test,最简单的做法就是把 test 放在第一句执行。
用skeleton.AfterFunc ,1个timer定时处理 所有用户的数据,其中1个出错。结果这个timer,就停了,所有用户都不处理了。
有没有办法让其他的用户依然能处理?