1# 错误管理开发指导 2 3## 场景介绍 4 5当应用的代码存在规范问题或错误时,会在运行中产生异常和错误,如应用未捕获异常、应用生命周期超时等。在错误产生后,应用会异常退出。错误日志通常会保存在用户本地存储上,不方便开发者定位问题。所以,应用开发者可以使用错误管理的接口,在应用退出前,及时将相关错误及日志上报到开发者的服务平台来定位问题。 6 7## 接口说明 8 9应用错误管理接口由[errorManager](../reference/apis/js-apis-app-ability-errorManager.md)模块提供,开发者可以通过import引入,详见[开发示例](#开发示例)。 10 11**错误管理接口功能介绍:** 12 13| 接口名称 | 说明 | 14| ------------------------------------------------------------ | ---------------------------------------------------- | 15| on(type: "error", observer: ErrorObserver): number | 注册错误监听接口,当系统监测到应用异常时会回调该监听。该接口为同步接口,返回值为注册的监听对象对应的序号。 | 16| off(type: "error", observerId: number, callback: AsyncCallback\<void\>): void | 以callback的形式解除注册监听,传入的number为之前注册监听时返回的序号。 | 17| off(type: "error", observerId: number): Promise\<void\> | 以Promise的形式解除注册监听,传入的number为之前注册监听时返回的序号。 | 18 19当采用callback作为异步回调时,可以在callback中进行下一步处理。当采用Promise对象返回时,可以在Promise对象中类似地处理接口返回值。具体结果码说明见[解除注册结果码](#解除注册结果码)。 20 21 22**错误监听(ErrorObserver)接口功能介绍:** 23 24| 接口名称 | 说明 | 25| ------------------------------ | ------------------------------------------------------------ | 26| onUnhandledException(errMsg: string): void | 系统回调接口,应用注册后,当应用产生未捕获的异常时的回调。 | 27| onException?(errObject: Error): void | 系统回调接口,应用注册后,当应用产生异常上报js层时的回调。 | 28 29 30### 解除注册结果码 31 32| 结果码 | 原因 | 33| ------ | --------------------------- | 34| 0 | 正常返回 | 35| -1 | 传入的number不存在 | 36| -2 | 参数错误 | 37 38## 开发示例 39```ts 40import UIAbility from '@ohos.app.ability.UIAbility'; 41import AbilityConstant from '@ohos.app.ability.AbilityConstant'; 42import errorManager from '@ohos.app.ability.errorManager'; 43import Want from '@ohos.app.ability.Want'; 44import window from '@ohos.window'; 45 46let registerId = -1; 47let callback: errorManager.ErrorObserver = { 48 onUnhandledException: (errMsg) => { 49 console.log(errMsg); 50 }, 51 onException: (errorObj) => { 52 console.log('onException, name: ', errorObj.name); 53 console.log('onException, message: ', errorObj.message); 54 if (typeof(errorObj.stack) === 'string') { 55 console.log('onException, stack: ', errorObj.stack); 56 } 57 } 58} 59let abilityWant: Want; 60 61export default class EntryAbility extends UIAbility { 62 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 63 console.log("[Demo] EntryAbility onCreate"); 64 registerId = errorManager.on("error", callback); 65 abilityWant = want; 66 } 67 68 onDestroy() { 69 console.log("[Demo] EntryAbility onDestroy"); 70 errorManager.off("error", registerId, (result) => { 71 console.log("[Demo] result " + result.code + ";" + result.message); 72 }); 73 } 74 75 onWindowStageCreate(windowStage: window.WindowStage) { 76 // Main window is created, set main page for this ability 77 console.log("[Demo] EntryAbility onWindowStageCreate"); 78 79 windowStage.loadContent("pages/index", (err, data) => { 80 if (err.code) { 81 console.error('Failed to load the content. Cause:' + JSON.stringify(err)); 82 return; 83 } 84 console.info('Succeeded in loading the content. Data: ' + JSON.stringify(data)); 85 }); 86 } 87 88 onWindowStageDestroy() { 89 // Main window is destroyed, release UI related resources 90 console.log("[Demo] EntryAbility onWindowStageDestroy"); 91 } 92 93 onForeground() { 94 // Ability has brought to foreground 95 console.log("[Demo] EntryAbility onForeground"); 96 } 97 98 onBackground() { 99 // Ability has back to background 100 console.log("[Demo] EntryAbility onBackground"); 101 } 102}; 103```