我想写个监听器,可以在游戏开始后监听到游戏发生的所有错误,应该怎么做呢。
我尝试过,window.onerror,window.onunhandledrejection,都无法监听到错误
得看环境,用window.onerror或者addEventListener来捕获全局错误也不是说没作用。这个可以捕获到大部分的运行时错误。比如语法错误可能在加载时就报错了,但运行时错误应该能被捕获到这样… 还有一切情况比如Promise的异常处理。因为如果Promise被reject了但没有catch处理的话,会被静默吃掉,这时候需要用unhandledrejection事件来捕获。还有比如小程序错误事件可以用onError,像脚本错误或者 API 调用报错等情况都能监听到比如wx.onError 具体要看你要监听那一方面的,暂时也不太清楚有什么方法可以覆盖的监听全环境整个流程下的错误
我考虑了一下我的监听场景,大概率是要监听者空指针,这种类似的错误。window.onerror和addEventListener还有unhandledrejection我都试过,貌似都监听不到。(测试环境是用的getChildByName(“不存在的节点”).addChild(…)抛出的错误)
因为业务代码是需要AI进行生成,我需要对AI生成的东西进行初期运行时报错的浅过滤
嗷嗷嗷,null.addChild(…) 会抛出TypeError但 Cocos内部可能通过try-catch吞掉了这个错误,导致全局监听失效(我猜测阿 具体得验证一下) 我有个点子阿 你说的这些错误其实都会从cc.error进行输出 可以试试劫持引擎的日志系统去捕获你想要的错误
那你继续让ai写全局监听呗。。
好主意,我也尝试了一下。。。
首先我用的cc.error = xxx来直接改写,发现error是只读的。
然后我用了重新定义属性的方法:

还是没有监听到,不知道是我写的方式错了还是根本就无法拦截cc.error
。。AI写得出来我就不会来问了
console.error = ((data) => {
})
试试这样?放到主逻辑入口
感觉应该在整个游戏的主循环部分增加一个try catch来尝试捕获其中所有的异常,先手捕获,防止被cocos自己吞了
console.error是可以拦截到的,因为这个方法不是只读可以直接修改,但是运行时错误cocos自己是用的cc.error,这个方法没法直接做出改变
改了引擎后记得编译引擎,不然不生效的
哈哈确实简单粗暴,估计就只有这种方法了,我下个源码版的试试
既然都这样了, 为啥不直接劫持引擎的error呢
不知道是不是写法问题,劫持没生效 囧
引擎的error没劫持成功
