HarmonyOS 鸿蒙Next 未捕获JS Crash异常导致应用崩溃该如何处理
【问题现象】
应用运行过程中可能会出现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问题时应用无闪退并在日志中记录堆栈
针对HarmonyOS鸿蒙Next系统中未捕获JS Crash异常导致应用崩溃的问题,这里提供几种可能的解决方案:
-
代码审查与异常捕获:首先,仔细检查JS代码,尤其是异步操作和事件处理部分,确保所有可能的异常都被try-catch块捕获。对于可能抛出异常的函数,务必进行异常处理,防止未捕获的异常导致应用崩溃。
-
日志记录与监控:增加日志记录功能,记录JS代码执行过程中的关键信息和异常信息。通过监控日志,可以快速定位导致崩溃的异常点,从而进行针对性修复。
-
内存管理:注意JS代码中的内存管理,避免内存泄漏和无效内存访问。合理分配和释放内存资源,确保应用在运行过程中不会因为内存问题而崩溃。
-
更新鸿蒙系统:确保鸿蒙系统为最新版本,因为新版本通常会修复已知的错误和漏洞,提高系统的稳定性和安全性。
-
工具链与依赖更新:检查并更新开发工具链和所有相关依赖库,确保它们与鸿蒙系统的最新版本兼容。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。