HarmonyOS鸿蒙Next中ArkTS如何捕获和处理@Watch或@Effect中抛出的异常,避免应用挂起?
可以通过鸿蒙提供的[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
中的逻辑抛出异常,也能被捕获并处理,确保应用继续正常运行。