JS报错无限循环,出不去怎么破,客户端卡死

在游戏中tween中一报错就会死循环,一直无限报同一处,这一帧就过不去了。客户端卡死
有没有大佬告之下怎么破

不能保证代码中没有bug,或者测试没测到的一些情况
但这种无限循环,卡死,不能忍啊

你倒是给个错误栈啊…要不然大佬们用意念帮你吗…

一直报错 也可以解决第一次报错的就成了 应该是异步了值不对了

let a = [];
tween(this.node).call(()=>{
a = null;
console.log(a.length)
}).start()

给大佬示例代码

let a = [];
cc.tween(cc.find(“Canvas”)).call(()=>{
a = null;
console.log(a?.length)
}).start()

let a = [];
cc.tween(cc.find(“Canvas”)).call(()=>{
a = null;
try {
console.log(a.length)
} catch (err) {
console.error(err);
}
}).start()

两种都行。

这种在回调里面的报错 tween 不好处理,tween 内不可能用 try catch 跑每个动作,太耗了。

你自己用 try catch 包一下整个 tween 的调用就好了。

let a = [];
try {
  cc.tween(node)
    ...
} catch (e) {
  cc.log(e)
}

是为了先让它跑起来罢了 难不成上线版还不打算把bug解决掉

我知道报错点了。我肯定可以这样容错
但我不可能所有代码都带这样的容错吧。
况且线上版本出问题,直接客户端卡死了。
我们有添加了 错误日志上传。现在客户端卡死了。这些也走不下去了。
或者日志后台成千上万的相同错误日志

真正的项目代码里面,容易出错(比如拉后台数据)加 try catch 容错是很正常的事情,不要怕用 try catch,影响没那么大。

既然你自己都没有办法预见这个错误,你又怎么能要求引擎必须能够处理所有错误。。。

记住 js 是单线程跑的。

a 都为null了, 咋获取length

我觉得这种不可预知的或者在紧急处理的时候加容错很正常。。。确定处理了问题觉得影响了性能就再去掉呗

日志后台的话要不就加个标记过滤,同用户同一标记的日志不重复上传这类?

代码这样看起来不行,跑起来应该还是会报错

如果项目中用tween的call多并且不确定会不会在call里面有没有错并且嫌每个call都要手动包try麻烦的话,还可以定制一下引擎里的CallFunc类修改一下这个函数
/*
* execute the function.
*/
execute () {
if (this._function) {
try{
this._function.call(this._selectorTarget, this.target, this._data);
}catch(err){
console.error(err);
}

    }
}

兄弟这个思路可以啊。
我决定在所有的tween call,或者一些异步里面调用一个通用容错

我也来学习一下

补充一下
按希格斯坡色子老哥说的
tween中call的无限报错
修改了action-instant.ts文件中的execute方法

/*
 * execute the function.
 */
execute () {
    if (this._function) {
        try{
            this._function.call(this._selectorTarget, this.target, this._data);
        }catch(err){
            console.error(err);
        }
    }
}

用schedule的回调,无限报错问题,修改scheduler.ts中的trigger方法

public trigger () {
    if (this._target && this._callback) {
        this._lock = true;
        try{
            this._callback.call(this._target, this._elapsed);
        }catch(err){
            console.error(err);
        }
        this._lock = false;
    }
}

重新编译引擎,搞定!

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。