-
Creator 版本:2.0.10
-
详细报错信息,包含调用堆栈:
-
重现方式:新建一个组件继承于cc.Component,在start函数内写一个访问空对象的属性,这时候会出现空对象报错,按理这个start函数只会执行一次,报错应该只输出一次,但现在会不断的抛出错误,并导致整个游戏线程卡死了,包括资源加载cc.loader.loadRes的回调函数内报错也会出现这种情况。这样一旦在这些类似的函数中出现报错是非常危险的。是否有办法能够避免这种情况出线呢?
- 出现概率:100%
Creator 版本:2.0.10
详细报错信息,包含调用堆栈:
重现方式:新建一个组件继承于cc.Component,在start函数内写一个访问空对象的属性,这时候会出现空对象报错,按理这个start函数只会执行一次,报错应该只输出一次,但现在会不断的抛出错误,并导致整个游戏线程卡死了,包括资源加载cc.loader.loadRes的回调函数内报错也会出现这种情况。这样一旦在这些类似的函数中出现报错是非常危险的。是否有办法能够避免这种情况出线呢?
回头我想看看
我看了下cocos2d-js-for-preview.js里的源码,应该是在mainloop里执行的生命周期的函数都有可能出现这种问题,例如onload,start,onDestroy,onEnabled,onDisabled,在执行循环执行这些周期函数的时候,一旦有一个组件的函数报错,就会导致该遍历中断,后续无法将数组清空,导致下一次mainloop又继续遍历,继续出错,而游戏中所有的组件生命周期函数都会在一个循环体里进行,一个组件报错,将导致游戏内后续所有的组件将无法正常运行。
这块希望优化一下,每个组件的生命周期函数错误,应该不影响其他的组件运行,不然对开发者的要求有点高了,甚至风险很大,我现在只能自己封装一个继承于cc.Component的类,在start和onload等函数里加上try catch来避免这种出错就导致游戏线程卡死的情况。
是比较蛋痛,不方便调试
妥协了,之后所有 onLoad / start / update / lateUpdate 都会做 try catch 保护
https://github.com/cocos-creator/engine/pull/4941
其它生命周期回调目前没有类似处理,因为比较复杂,弄不好会影响性能
我也发现这个问题了。。。 修复的好快~ 预计哪个版本放出来呢~
2.1.3
感谢技术大大,这样大大提供了容错!给力
我用的2.4.3出现了这个问题,很是头疼