全局捕捉异常

cocos creator v3.5.2
原生通过__errorHandler捕捉js/ts层错误后
想要弹出个弹框
但是报错以后加载弹框无法加载 整个界面都动不了 请问您们是怎么解决的

4赞

image

主动抛出报错 然后界面完全动弹不得 请问是什么原因

@jare

有人知道吗

你有试试最新的 3.8.3 吗。我测试了一下,是能够正常的在异常回调中显示 ui 的。

(window as any).__errorHandler = function (name, line, msg, stack) {
    console.log(`name: ${name}`);
    console.log(`line: ${line}`);
    console.log(`msg: ${msg}`);
    console.log(`stack: ${stack}`);

    myMsgLabel.active = true;
    myMsgLabel.getComponent(Label).string = '你好出错啦。。。。';
};

Screenshot 2024-05-20 at 15.03.55

1赞

我的引擎版本是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必现