2.0.10在生命周期start里出现报错 会一直抛出报错并导致游戏卡死

  • Creator 版本:2.0.10

  • 详细报错信息,包含调用堆栈:

  • 重现方式:新建一个组件继承于cc.Component,在start函数内写一个访问空对象的属性,这时候会出现空对象报错,按理这个start函数只会执行一次,报错应该只输出一次,但现在会不断的抛出错误,并导致整个游戏线程卡死了,包括资源加载cc.loader.loadRes的回调函数内报错也会出现这种情况。这样一旦在这些类似的函数中出现报错是非常危险的。是否有办法能够避免这种情况出线呢?

  • 出现概率:100%

回头我想看看

我看了下cocos2d-js-for-preview.js里的源码,应该是在mainloop里执行的生命周期的函数都有可能出现这种问题,例如onload,start,onDestroy,onEnabled,onDisabled,在执行循环执行这些周期函数的时候,一旦有一个组件的函数报错,就会导致该遍历中断,后续无法将数组清空,导致下一次mainloop又继续遍历,继续出错,而游戏中所有的组件生命周期函数都会在一个循环体里进行,一个组件报错,将导致游戏内后续所有的组件将无法正常运行。

这块希望优化一下,每个组件的生命周期函数错误,应该不影响其他的组件运行,不然对开发者的要求有点高了,甚至风险很大,我现在只能自己封装一个继承于cc.Component的类,在start和onload等函数里加上try catch来避免这种出错就导致游戏线程卡死的情况。

1赞

是比较蛋痛,不方便调试

妥协了,之后所有 onLoad / start / update / lateUpdate 都会做 try catch 保护
https://github.com/cocos-creator/engine/pull/4941
其它生命周期回调目前没有类似处理,因为比较复杂,弄不好会影响性能

2赞

我也发现这个问题了。。。 修复的好快~ 预计哪个版本放出来呢~

2.1.3

感谢技术大大,这样大大提供了容错!给力:grinning:

1赞

我用的2.4.3出现了这个问题,很是头疼