全局异常捕获,如何让TS端的报错不要一直不断的循环而是单次报错后停止?

  • Creator 版本: 3.6.2
  • 目标平台: Android iOS

背景:想做游戏的全局报错收集,并在报错后弹窗确认框让玩家手动重启游戏。

实现:以 Android 端为例,在 game.h game.cpp 中复写了
virtual void handleException(const char *location, const char *message, const char *stack);
并通过 JniHelper 把错误信息传到 Java 端。

问题:现在发现 TS/JS 端的报错信息能成功捕获,并传递到Java层。但是会一直不断的重复报当前的错误信息,造成游戏卡顿,无法执行后续的弹窗操作。请教各位大佬,有没有什么好的解决方案。在TS CPP端调用 game.pause 等方案并不能解决问题,报错还是一直持续。

我也想知道

顶一顶,有大佬知道吗,求助 :upside_down_face:

感谢反馈,能否提供一个复现问题的 demo ?

是否在 setTimeout 回调中触发了脚本异常?

合并一下如下 PR,再验证看看:

感谢官方大大。之前是直接在游戏内写的测试代码,因为没有找到解决方案就搁置了,也没有抽离demo出来测试,目前项目开发比较繁忙暂时没时间去推进这个事情。但是之前遇到的情况就像我在帖子里面说的,应该也说的挺清楚了。
回答下上面的问题:

  1. 我当初测试的时候写的报错逻辑不是在setTimeout中做的。我们当时游戏的报错是因为 sprite frame 的 texture 被意外释放了,所以其实是渲染流程的报错,所以这个报错就一直在报个不停。如果是类似于对一个空对象执行函数调用这种的话本身就不会重复循环报错的。
    2.上面的PR是在3.8之后才提交的吧,我们用的是3.6.2,所以没有去关注到,后续我找时间验证下

另外,想提问下,上述说的 handleException 是在C++层的,意味着只能给移动端用。那有没有办法在游戏逻辑端,ts代码中直接接收到全局的报错信息呢,这样就可以直接在游戏端实现错误解析做到和平台无关就更好了

3.8.3什么时候放出来啊

ts 层可以考虑使用:

jsb.onError(function (location, message, stack) {
    console.error(location, message, stack);
    // 你的处理函数
});

期待 3.8.3

3.8.3 没见到 jsb.onError 方法. 另外同问, 这个方法在 Web 端也同样有用吗?

web 上没有 onError,但是可以通过 window.onerror ( https://developer.mozilla.org/en-US/docs/Web/API/Window/error_event ) 来处理。

jsb.onError 是原生上才有的。目前应该没有导出到 ts 声明文件。可以暂时先声明一下 jsb 为 any,然后调用。

declare const jsb: any;
jsb.onError(function (location, message, stack) {
    console.error(location, message, stack);
    // 你的处理函数
});
1赞

jsb.onError 3.8.2可以使用吗

在3.8.3 执行的代码错误,被 try catch捕获了,只会在控制台打印出来,用 重写 onerror 监听不到错误,进行自定义逻辑处理。