全局处理异常,对于发生的js crash进行全局统一管控,存在两点好处。

对于发生的js crash进行全局统一管控,存在两点好处。1.方便解耦,无需反复处理不同地方的异常。2.增强应用的健壮性,防止异常崩溃。

HarmonyOS
2024-05-22 23:31:13
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
唯你而画

使用的核心API

ErrorManager.on(type: 'error', observer: ErrorObserver): number

核心代码解释

核心代码如下:

//EntryAbility.ets 
import AbilityConstant from '@ohos.app.ability.AbilityConstant'; 
import hilog from '@ohos.hilog'; 
import UIAbility from '@ohos.app.ability.UIAbility'; 
import Want from '@ohos.app.ability.Want'; 
import window from '@ohos.window'; 
import errorManager from '@ohos.app.ability.errorManager'; 
 
export default class EntryAbility extends UIAbility { 
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { 
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); 
    //创建异常发生时的回调 
    let observer: errorManager.ErrorObserver = { 
      //onUnhandledException回调,回调返回的对象为一个字符串 
      onUnhandledException(errorMsg) { 
        console.log('testTagonUnhandledException, errorMsg: ', errorMsg); 
      }, 
      //onException回调,回调返回的对象是一个包装好的对象,存在一些属性 
      onException(errorObj) { 
        console.log('testTagonException, name: ', errorObj.name); 
        console.log('testTagonException, message: ', errorObj.message); 
        if (typeof(errorObj.stack) === 'string') { 
          console.log('testTagonException, stack: ', errorObj.stack); 
        } 
      } 
      //以上两种回调唯一区别在于回调返回值是否封装为对象,无功能类的区别 
    }; 
    let observerId = -1; 
    //开启监听异常 
    observerId = errorManager.on('error', observer); 
  } 
 
  onDestroy(): void { 
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); 
  } 
 
  onWindowStageCreate(windowStage: window.WindowStage): void { 
    // Main window is created, set main page for this ability 
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); 
 
    windowStage.loadContent('pages/Index', (err, data) => { 
      if (err.code) { 
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); 
        return; 
      } 
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); 
    }); 
  } 
 
  onWindowStageDestroy(): void { 
    // Main window is destroyed, release UI related resources 
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); 
  } 
 
  onForeground(): void { 
    // Ability has brought to foreground 
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); 
  } 
 
  onBackground(): void { 
    // Ability has back to background 
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); 
  } 
} 
 
  • 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.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.

总结:

主要难点在于:文档中对两种回调的描述是存在区别的,以致于读者容易产生误解,将两种回调理解为一样的能力,只是返回值类型不同即可。

实现效果

回调触发,异常被处理,应用未崩溃继续运行

注明适配的版本信息

 IDE:DevEco    Studio 4.1.3.500

 SDK:HarmoneyOS    4.0.10.16

分享
微博
QQ
微信
回复
2024-05-23 21:18:38
相关问题
PolarDB更改为模式后登录DMS异常
3575浏览 • 1回复 待解决
HarmonyOS 应用
585浏览 • 1回复 待解决
如何统一管理字体属性?
3287浏览 • 1回复 待解决
HarmonyOS 使用全局 @Builder 应用 crash
767浏览 • 1回复 待解决
HarmonyOS 对权限情况
760浏览 • 1回复 待解决
HarmonyOS可以全局捕获异常吗?
785浏览 • 1回复 待解决
hilog 怎么实现日志
1453浏览 • 1回复 待解决
怎么进行全局初始化操作?
315浏览 • 0回复 待解决
HarmonyOS 如何进行全局初始化操作
888浏览 • 1回复 待解决