• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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```