如何使用DFX的ErrorManager来捕获js异常?

使用DFX的ErrorManager来注册错误观测器并捕获js异常,并且希望应用崩溃时进程不会退出。

HarmonyOS
2024-05-28 21:07:11
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zdl2000

应用错误管理接口由errorManager模块提供

错误管理接口功能介绍:



接口名称




说明


on(type: "error", observer: ErrorObserver): number

注册错误监听接口,当系统监测到应用异常时会回调该监听。该接口为同步接口,返回值为注册的监听对象对应的序号。

off(type: "error", observerId: number, callback: AsyncCallback<void>): void

以callback的形式解除注册监听,传入的number为之前注册监听时返回的序号。

off(type: "error", observerId: number): Promise<void>

以Promise的形式解除注册监听,传入的number为之前注册监听时返回的序号。

当采用callback作为异步回调时,可以在callback中进行下一步处理。当采用Promise对象返回时,可以在Promise对象中类似地处理接口返回值。

异常监听(ErrorObserver)接口功能介绍:



接口名称




说明


onUnhandledException(errMsg: string): void

系统回调接口,应用注册后,当应用产生未捕获的异常时的回调。

onException?(errObject: Error): void

系统回调接口,应用注册后,当应用产生异常上报js层时的回调。

错误测试:

@Entry 
@Component 
struct CrashPage { 
  @State message: string = 'Hello World' 
  build() { 
    Row() { 
      Column() { 
        Button('捕获异常') 
          .onClick(() => { 
            let tempList = ['0', '1'] 
            tempList[5].toString() 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}

错误观察器注册:

import UIAbility from '@ohos.app.ability.UIAbility'; 
import AbilityConstant from '@ohos.app.ability.AbilityConstant'; 
import errorManager from '@ohos.app.ability.errorManager'; 
import Want from '@ohos.app.ability.Want'; 
import window from '@ohos.window'; 
  
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 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"); 
    } 
};

实现效果:

分享
微博
QQ
微信
回复
2024-05-29 22:11:57
相关问题
ErrorManager捕获js异常
282浏览 • 1回复 待解决
如何捕获应用发生异常
221浏览 • 1回复 待解决
烧录捕获异常信息,怎么解决?
7037浏览 • 2回复 待解决
JS调用PA出现RemoteInterfaceProxy异常
5362浏览 • 2回复 待解决
如何使用margin解决外边距问题
582浏览 • 1回复 待解决
使用TextPicker控件显示异常问题
341浏览 • 1回复 待解决
DFX-Hilog日志打印指导
209浏览 • 1回复 待解决
鸿蒙上如何使用jsprotobuf
2402浏览 • 1回复 待解决
创建JS项目如何使用webview?
3311浏览 • 1回复 待解决
@Builder使用引用时异常
381浏览 • 1回复 待解决
DFX(Design For X)子系统是什么?
20273浏览 • 4回复 待解决
使用ArkTS调用Java代码吗?
4512浏览 • 1回复 待解决
使用js语言如何开发相机
1600浏览 • 1回复 待解决
鸿蒙js 如何使用动态style
6003浏览 • 1回复 待解决
使用zIndex改变图片层级思路
253浏览 • 1回复 待解决
DFX-性能打点(HiTrace)指导
210浏览 • 1回复 待解决
DFX-crash定位定界工具
197浏览 • 1回复 待解决
可以用JS UI组件做进度展示吗?
4627浏览 • 1回复 待解决