全局捕捉异常

我的引擎版本是v3.5.2的 您好

@dumganhar 代码也是跟你这么写 只是我是异步加载一个prefab弹窗出来显示

移动端原生是可以通过__errorHandler捕获js/ts的错误的,是吗

有没有引擎工作人员告知一下 可以提供demo

image image image image 这样子的报错貌似捕获不到呢

3.8.3 有修复过一个关于捕获不到异常的问题:

如果你们不是用 3.8.3 引擎,可以考虑按照 PR 手动修改一下代码,再试试看。

1赞

__errorHandler 应该是早期的方式。功能上是与 jsb.onError 一样的。小区别是:

  • __errorHandler 是全局变量,直接赋值:
__errorHandler = function(name, line, msg, stack) {...};
  • jsb.onError 是接收一个函数作为参数:
jsb.onError(function (location, message, stack) {
    console.error(location, message, stack);
});

报错以后 界面完全动弹不得是什么原因
我这边是测试点击按钮的回调里面主动throw错误
错误是捕捉到了 在 _errorHandler回调里面进行弹窗也是执行完了
但是就是见不到弹窗 而且界面卡死

界面卡死 是因为报错了呀 后面不执行了 不知道你的界面管理是怎么设计的 如果是同步就要遭 用异步的试试

异步的 已经执行完毕了 但是弹窗出不来 层级也是最高的

而且这个我是自己测试报错
点击测试按钮 throw错误

捕捉成功了的

我觉得你应该try你的错误层 存起来(比如50条) 通过其他方式打开你的errorView界面(在某个地方点击20下)

看了下源码,功能好像不一样。

__errorHandler 只捕捉部分错误(onMessageCallback),jsb.onError 能捕捉下面所有的错误。

ScriptEngine.cpp

    _isolate->SetCaptureStackTraceForUncaughtExceptions(true, JSB_STACK_FRAME_LIMIT, v8::StackTrace::kOverview);
    _isolate->SetFatalErrorHandler(onFatalErrorCallback);
    _isolate->SetOOMErrorHandler(onOOMErrorCallback);
    _isolate->AddMessageListener(onMessageCallback);    // <- __errorHandler
    _isolate->SetPromiseRejectCallback(onPromiseRejectCallback);

有点小建议:https://github.com/cocos/cocos-engine/issues/17025

嗯,看了代码是如你说的情况。
这块代码年代有点久远,最早实现的时候是只有 __errorHandler 的。是需要重新缕缕。

就是想问一下 报错以后 界面完全动弹不得 这个怎么处理 没有陷入死循环
之前2.x版本没问题的 我现在的3.5.2必现

有尝试应用一下这个回复中的补丁吗?

https://forum.cocos.org/t/topic/158095/11?u=dumganhar

是指修改input.ts吗

Object.cpp的文件我的3.5.2对比了一下不需要修改

我不是捕获不到异常 我是捕获以后 界面就卡死了
但是websocket收发消息正常 也没有陷入死循环

麻烦提供个复现问题的最小 Demo 吧。

demo_test.zip (2.0 MB)
@dumganhar 您好 麻烦看看