HarmonyOS 鸿蒙Next 未捕获JS Crash异常导致应用崩溃该如何处理

发布于 1周前 作者 htzhanglong 最后一次编辑是 5天前 来自 鸿蒙OS

【问题现象】

应用运行过程中可能会出现js crash异常,当出现未被捕获的js crash异常时应用崩溃。如下图:

点击放大

【背景知识】

ErrorManager模块提供对错误观察器的注册和注销的能力,在EntryAbility中配置即可实现统一处理(目前taskpool中不支持捕获异常)。

【解决方案】

1. 手动try-catch

针对出现异常的代码段手动try-catch捕获异常,如下(报错结果:error: TypeError: Get Property index out-of-bounds):

import { ArrayList } from '@kit.ArkTS';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  build() {
    Row() {
      Column() {
        Button(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.testClick()
          })
      }
      .width('100%')
    }
    .height('100%')
  }

  doublePages = new ArrayList<number>()

  testClick() {
    try {
      let i: number = this.doublePages[1] // index out-of-bounds
      i++
    } catch (e) {
      console.log('error: ', e);
    }
  }
}

2. ErrorManager 模块统一捕获

虽然通过try-catch能捕获异常,但整体方案仍然存在一定缺陷,比如添加大量try-catch导致可读性变差、遗漏JS Crash未被捕获。因此建议通过ErrorManager模块统一捕获未知JS Crash,具体如下:

  • 注册异常监听:在EntryAbility的onCreate方法中注册异常监听(注销方法需同步通过errorManager.off实现)
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');

  let observer1: errorManager.ErrorObserver = {
    onUnhandledException(errorMsg) {
      console.log('onUnhandledException, errorMsg: ', errorMsg);
    },
    onException(errorObj) {
      console.log('onException, name: ', errorObj.name);
      console.log('onException, message: ', errorObj.message);
      if (typeof (errorObj.stack) === 'string') {
        console.log('onException, stack: ', errorObj.stack);
      }
    }
  };
  let observerId = -1;
  try {
  // 注册错误观测器。注册后可以捕获到应用产生的js crash,应用崩溃时进程不会退出。
  observerId = errorManager.on('error', observer1);
} catch (paramError) {
  let code = (paramError as BusinessError).code;
  let message = (paramError as BusinessError).message;
  console.error(`error: ${code}, ${message}`);
}

let observer2: errorManager.UnhandledRejectionObserver = (reason: Error, promise: Promise<void>) => {
  if (promise === promise1) {
    console.log("promise1 is rejected");
  }
  console.log("reason.name: ", reason.name);
  console.log("reason.message: ", reason.message);
  if (reason.stack) {
    console.log("reason.stack: ", reason.stack);
  }
};

// 注册被拒绝promise监听器。注册后可以捕获到当前线程中未被捕获到的promise rejection。
errorManager.on("unhandledRejection", observer2);

let promise1 = new Promise<void>(() => {
}).then(() => {
  throw new Error("uncaught error");
});
}
  • 运行效果:出现JS Crash问题时应用无闪退并在日志中记录堆栈

点击放大

1 回复

针对HarmonyOS鸿蒙Next系统中未捕获JS Crash异常导致应用崩溃的问题,这里提供几种可能的解决方案:

  1. 代码审查与异常捕获:首先,仔细检查JS代码,尤其是异步操作和事件处理部分,确保所有可能的异常都被try-catch块捕获。对于可能抛出异常的函数,务必进行异常处理,防止未捕获的异常导致应用崩溃。

  2. 日志记录与监控:增加日志记录功能,记录JS代码执行过程中的关键信息和异常信息。通过监控日志,可以快速定位导致崩溃的异常点,从而进行针对性修复。

  3. 内存管理:注意JS代码中的内存管理,避免内存泄漏和无效内存访问。合理分配和释放内存资源,确保应用在运行过程中不会因为内存问题而崩溃。

  4. 更新鸿蒙系统:确保鸿蒙系统为最新版本,因为新版本通常会修复已知的错误和漏洞,提高系统的稳定性和安全性。

  5. 工具链与依赖更新:检查并更新开发工具链和所有相关依赖库,确保它们与鸿蒙系统的最新版本兼容。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部