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

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

HarmonyOS
2024-05-22 23:31:13
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
bho2000

使用的核心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'); 
  } 
} 
 

总结:

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

实现效果

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

注明适配的版本信息

 IDE:DevEco    Studio 4.1.3.500

 SDK:HarmoneyOS    4.0.10.16

分享
微博
QQ
微信
回复
2024-05-23 21:18:38
相关问题
PolarDB更改为模式后登录DMS异常
1714浏览 • 1回复 待解决
如何统一管理字体属性?
1173浏览 • 1回复 待解决
hilog 怎么实现日志
363浏览 • 1回复 待解决
组件如何动态设置全局ID?
5645浏览 • 1回复 待解决
如何全局存储WebController
414浏览 • 1回复 待解决
如何支持全局主题切换
407浏览 • 1回复 待解决
如何实现全局浮窗效果
663浏览 • 1回复 待解决
如何全局设置页面转场动画
324浏览 • 1回复 待解决
多态样式可否导出给全局使用
601浏览 • 1回复 待解决
如何捕获应用发生异常
250浏览 • 1回复 待解决
如何在全局实现个自定义dialog弹窗
1149浏览 • 1回复 待解决
怎么让项目全局使用d.ts
1993浏览 • 1回复 待解决
如何实现 app 内置全局悬浮球功能?
661浏览 • 1回复 待解决
在Native侧调用ArkTS全局普通方法
383浏览 • 1回复 待解决
如何处理消息被频问题
650浏览 • 1回复 待解决