HarmonyOS鸿蒙Next中ArkTS如何捕获和处理@Watch或@Effect中抛出的异常,避免应用挂起?

HarmonyOS鸿蒙Next中ArkTS如何捕获和处理@Watch@Effect中抛出的异常,避免应用挂起? 在ArkTS中,如何捕获和处理@Watch@Effect中抛出的异常,避免应用挂起?

#HarmonyOS最强问答官#

3 回复

可以通过鸿蒙提供的[audio href=“https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-app-ability-errormanager-V5”]errorManager[/audio]进行全局异常捕获处理,那样@Watch@Effect发生异常时,就会被errorManager进行不会,业务处理异常,不会出现因为异常导致应用被挂起情况。

全局异常捕获示例代码:

import { AbilityConstant, errorManager, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import process from '@ohos.process';

let registerId = -1;
let callback: errorManager.ErrorObserver = {
  onUnhandledException: (errMsg) => {
    console.log(errMsg);
  },
  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 pro = new process.ProcessManager();
    pro.exit(0);
  }
}

let abilityWant: Want;

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    console.log("[Demo] EntryAbility onCreate");
    registerId = errorManager.on("error", callback);
    abilityWant = want;
  }

  onDestroy() {
    console.log("[Demo] EntryAbility onDestroy");
    errorManager.off("error", registerId, (result) => {
      console.log("[Demo] result " + result.code + ";" + result.message);
    });
  }

  onWindowStageCreate(windowStage: window.WindowStage) {
    // Main window is created, set main page for this ability
    console.log("[Demo] EntryAbility onWindowStageCreate");

    windowStage.loadContent("pages/index", (err, data) => {
      if (err.code) {
        console.error('Failed to load the content. Cause:' + JSON.stringify(err));
        return;
      }
      console.info('Succeeded in loading the content. Data: ' + JSON.stringify(data));
    });
  }

  onWindowStageDestroy() {
    // Main window is destroyed, release UI related resources
    console.log("[Demo] EntryAbility onWindowStageDestroy");
  }

  onForeground() {
    // Ability has brought to foreground
    console.log("[Demo] EntryAbility onForeground");
  }

  onBackground() {
    // Ability has back to background
    console.log("[Demo] EntryAbility onBackground");
  }
};

更多关于HarmonyOS鸿蒙Next中ArkTS如何捕获和处理@Watch或@Effect中抛出的异常,避免应用挂起?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,ArkTS通过@Watch@Effect装饰器来监听状态变化并执行副作用逻辑。为了捕获和处理这些装饰器中抛出的异常,避免应用挂起,可以使用try-catch语句来包裹可能抛出异常的代码块。

对于@Watch,当被监听的状态发生变化时,@Watch修饰的函数会被调用。如果该函数中抛出异常,未捕获的异常会导致应用挂起。因此,可以在@Watch修饰的函数中使用try-catch来捕获异常并进行处理。

对于@Effect,它通常用于执行副作用操作,如网络请求或异步任务。如果@Effect修饰的函数中抛出异常,同样需要使用try-catch来捕获异常,以防止应用挂起。

示例代码如下:

@State count: number = 0;

@Watch('count')
onCountChange(newValue: number, oldValue: number) {
  try {
    // 可能抛出异常的代码
  } catch (error) {
    // 处理异常
  }
}

@Effect
someEffect() {
  try {
    // 可能抛出异常的代码
  } catch (error) {
    // 处理异常
  }
}

在HarmonyOS鸿蒙Next中,ArkTS通过@Watch@Effect监听状态变化时,若回调函数抛出异常,应用可能会挂起。为避免这种情况,建议在回调函数内部使用try-catch块捕获异常并进行处理。例如:

@State count: number = 0;

@Watch('count')
onCountChange() {
  try {
    // 可能抛出异常的代码
  } catch (error) {
    console.error('捕获到异常:', error);
  }
}

通过这种方式,即使@Watch@Effect中的逻辑抛出异常,也能被捕获并处理,确保应用继续正常运行。

回到顶部