引言

在HarmonyOS的应用开发中,确保应用的稳定性和可靠性至关重要。当应用遇到未捕获的异常或错误时,系统默认处理方式是终止进程,这可能导致用户数据丢失和工作流程中断。为了改善用户体验,HarmonyOS提供了错误管理和应用故障恢复的接口,允许开发者捕捉异常、记录错误日志,并在必要时恢复应用状态,避免数据丢失。

错误管理

接口概览

错误管理接口由errorManager模块提供,允许开发者注册监听器以捕捉应用中的未处理异常,并将这些错误上报至开发者的服务平台进行分析和修复。

注册错误监听
const registerId = errorManager.on("error", callback);
  • 1.
解除错误监听
errorManager.off("error", registerId).then(() => {
    console.log("[Demo] Listener unregistered successfully.");
}).catch((err) => {
    console.error("[Demo] Error while unregistering listener:", err);
});
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
错误监听回调

当系统检测到未处理的异常时,ErrorObserver接口的onUnhandledException方法会被调用。

const callback = {
    onUnhandledException: function (errMsg) {
        console.log("[Demo] Unhandled exception:", errMsg);
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

应用故障恢复

接口概览

应用故障恢复接口由appRecovery模块提供,允许开发者在应用遇到故障时保存应用状态,并在应用重启时恢复到故障前的状态。

HarmonyOS入门之错误监控与应用恢复机制_错误监控

使能应用恢复
appRecovery.enableAppRecovery(
    appRecovery.RestartFlag.ALWAYS_RESTART,
    appRecovery.SaveOccasionFlag.SAVE_WHEN_ERROR | appRecovery.SaveOccasionFlag.SAVE_WHEN_BACKGROUND,
    appRecovery.SaveModeFlag.SAVE_WITH_FILE
);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
主动保存应用状态
appRecovery.saveAppState();
  • 1.
重启应用
appRecovery.restartApp();
  • 1.
数据保存与恢复

saveAppState()被调用时,框架会回调onSaveState方法,开发者可以在其中保存数据。重启应用时,数据可以从onCreate方法的want参数中恢复。

onSaveState(state, wantParams) {
    wantParams["myData"] = "my1234567";
    return AbilityConstant.OnSaveResult.ALL_AGREE;
}

onCreate(want, launchParam) {
    if (launchParam.launchReason == AbilityConstant.LaunchReason.APP_RECOVERY) {
        let recoveryData = want.parameters["myData"];
        // 恢复数据
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

示例代码

以下是一个结合错误管理和应用故障恢复的示例代码,展示了如何在应用中注册错误监听器,捕捉异常,保存应用状态,并在重启时恢复状态。

import AbilityStage from '@ohos.app.ability.AbilityStage';
import errorManager from '@ohos.app.ability.errorManager';
import appRecovery from '@ohos.app.ability.appRecovery';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import LocalStorage from '@ohos.data.localstorage.LocalStorage';

let registerId = -1;
let callback = {
    onUnhandledException: function (errMsg) {
        console.log("[Demo] Unhandled exception:", errMsg);
        appRecovery.saveAppState();
        appRecovery.restartApp();
    }
};

export default class EntryAbility extends AbilityStage {
    storage: LocalStorage;

    onCreate(want, launchParam) {
        console.log("[Demo] EntryAbility onCreate");
        registerId = errorManager.on("error", callback);
        globalThis.abilityWant = want;
        if (launchParam.launchReason == AbilityConstant.LaunchReason.APP_RECOVERY) {
            this.storage = new LocalStorage();
            let recoveryData = want.parameters["myData"];
            this.storage.setOrCreate("myData", recoveryData);
            this.context.restoreWindowStage(this.storage);
        }
    }

    onDestroy() {
        console.log("[Demo] EntryAbility onDestroy");
        errorManager.off("error", registerId).then(() => {
            console.log("[Demo] Listener unregistered successfully.");
        }).catch((err) => {
            console.error("[Demo] Error while unregistering listener:", err);
        });
    }

    onSaveState(state, wantParams) {
        console.log("[Demo] EntryAbility onSaveState");
        wantParams["myData"] = "my1234567";
        return AbilityConstant.OnSaveResult.ALL_AGREE;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.

结论

通过结合使用errorManagerappRecovery模块,HarmonyOS应用开发者可以有效地捕捉并处理应用中的异常,同时在应用遇到故障时保护用户数据,提供更稳定的用户体验。