引擎版本:3.7.3
打包方式:web-mobile , electron
问题描述:程序只要出现任何一个报错,就会导致整个界面卡死,无法点击。目前已知可以通过try catch来包裹有问题的代码块,避免影响其他逻辑的执行。
因为我这个游戏逻辑很复杂,发布的时候很难测的全,出现一个报错(这个报错从逻辑上来说可能没什么影响,譬如玩家hover一张卡牌因为报错没弹tips,但这不影响他玩)玩家直接玩不了很影响游戏体验。不可能所有的代码都加try catch吧,请教一下这种应该如何处理。
判空处理能解决前端95%的问题,剩下的5%是死循环。
window.onerror = function(message, source, lineno, colno, error) {
console.error("Captured error:", message);
return true;
};
这是粗暴的处理,真要优雅还是在具体业务里面判断可能的报错,并根据不同的错误给出具体的报错信息以便后续排查。
感谢你的回答,在3.7.3中程序报错时,没有执行window.onerror。我试了下只通过window.console.error来获取具体的错误信息上报。
我本意是想找到一种,不影响游戏逻辑的错误,即使报错了也能让玩家正常玩下去的机制
如果不是代码上的卡死, 只是渲染流的报错导致画面不刷新
可以考虑监控director.on(cc.Director.EVENT_AFTER_DRAW 事件来判断
若果这个回调一直不触发, 那就是画面卡住了
如果要报错后还能正常玩下去,还是建议细致的try catch处理,不要怕麻烦。因为一旦你报错抛出错误,报错代码后面的代码段就不会被执行,而这个后面的代码段在不同函数里面不一样,所以在报错的函数内,用try catch才能比较准确的处理。
如果用统一错误处理,或者顶层的try catch,你也不知道抛出这个error后在抛出层级中有哪些后续代码被忽略了。可能会引起其他数据错误。
看来是偷不成懒了,确实只能这样