HarmonyOS应用如何进行错误处理与日志记录?


HarmonyOS
7天前
824浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
言程序plus

在 HarmonyOS 应用开发中,错误处理与日志记录是保障应用健壮性和可维护性的核心环节。以下是结合 ArkTS(HarmonyOS 主推语言)的完整实现方案:


### 一、错误处理机制

#### 1. 基础错误捕获

  • try-catch​ 块
    用于同步代码的异常捕获,处理明确的逻辑分支错误。
try {
  let result = someRiskyOperation();
} catch (error) {
  console.error(`操作失败: ${error.message}`);
  // 可选:上报错误到服务器
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 异步错误处理
    对于 Promiseasync/await,通过 .catch() 或嵌套 try-catch 捕获:
// Promise 方式
fetchData()
  .then(data => { /* 处理数据 */ })
  .catch(error => { console.error('异步错误:', error); });

// async/await 方式
async function loadData() {
  try {
    let data = await fetchData();
  } catch (error) {
    console.error('加载失败:', error);
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

#### 2. 自定义错误类型 通过继承 ​​Error​​ 定义业务相关错误,增强错误分类能力:

class NetworkError extends Error {
  constructor(message: string, public statusCode: number) {
    super(message);
    this.name = 'NetworkError';
  }
}

// 使用示例
throw new NetworkError('服务器超时', 504);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

#### 3. 全局错误监听

  • 应用级异常捕获
    注册全局错误处理器,捕获未被局部处理的异常:
// 在应用入口(EntryAbility)中设置
export default class EntryAbility extends Ability {
  onWindowStageCreate() {
    // 全局错误监听
    globalThis.addEventListener('error', (event) => {
      console.error('全局错误:', event.error);
      // 上报错误或显示友好提示
    });
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • Promise 未捕获异常
    监听 unhandledrejection 事件:
globalThis.addEventListener('unhandledrejection', (event) => {
  console.error('未处理的 Promise 异常:', event.reason);
});
  • 1.
  • 2.
  • 3.

### 二、日志记录策略

#### 1. 使用 HiLog​ 系统模块 HarmonyOS 提供标准日志接口 ​​@ohos.hilog​​,支持分级日志和标签过滤:

import hilog from '@ohos.hilog';

// 定义日志标签(格式:DOMAIN + SUFFIX)
const TAG: string = '[MyApp]';

// 记录不同级别日志
hilog.debug(0x0000, 'MyApp', '%{public}s: Debug message', TAG);
hilog.info(0x0000, 'MyApp', '%{public}s: User login success', TAG);
hilog.warn(0x0000, 'MyApp', '%{public}s: Low memory warning', TAG);
hilog.error(0x0000, 'MyApp', '%{public}s: Network timeout', TAG);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 日志级别
    DEBUG < INFO < WARN < ERROR < FATAL,可通过 hilog.setLogLevel() 动态调整输出级别。
  • 敏感信息保护
    使用 %{private}s%{public}s 标记敏感字段,避免隐私泄露:
hilog.info(0x0000, 'MyApp', 'User ID: %{private}s, Action: %{public}s', userId, action);
  • 1.

#### 2. 日志输出与查看

  • 控制台输出
    开发阶段可使用 console.log(),但需注意生产环境关闭。
  • 日志文件持久化
    结合 @ohos.file.fs 将日志写入应用沙箱:
import fs from '@ohos.file.fs';

async function writeLogToFile(message: string) {
  const path = '/data/logs/myapp.log';
  try {
    await fs.appendFile(path, `${new Date().toISOString()} ${message}\n`);
  } catch (error) {
    console.error('日志写入失败:', error);
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 查看日志
    通过 DevEco StudioLog 窗口,或使用 adb 命令:
hdc shell hilog | grep MyApp
  • 1.

### 三、最佳实践

#### 1. 错误处理原则

  • 明确错误边界:区分可恢复错误(如网络重试)与致命错误(如内存溢出)。
  • 用户友好提示:捕获错误后通过​​@ohos.promptAction​​ 显示友好提示:
import promptAction from '@ohos.promptAction';

function showErrorToast(message: string) {
  promptAction.showToast({ message, duration: 2000 });
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

#### 2. 日志规范

  • 结构化日志:统一格式(如 JSON),方便后续分析:
hilog.info(0x0000, 'MyApp', JSON.stringify({
  timestamp: Date.now(),
  level: 'INFO',
  module: 'Payment',
  message: 'Transaction completed'
}));
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 按场景分级
  • ​DEBUG​​:开发调试细节。
  • ​INFO​​:关键业务流程节点。
  • ​WARN​​:潜在问题预警。
  • ​ERROR​​:需干预的明确错误。

#### 3. 性能优化

  • 异步日志写入:避免主线程阻塞。
  • 生产环境降级:通过编译条件关闭​​DEBUG​​ 日志:
#ifndef DEBUG
hilog.setLogLevel(hilog.LogLevel.INFO);
#endif
  • 1.
  • 2.
  • 3.

### 四、示例场景

#### 网络请求错误处理

import { http } from '@ohos.net.http';
import hilog from '@ohos.hilog';

const TAG = '[Network]';

async function fetchData(url: string) {
  try {
    let response = await http.createHttp().request(url);
    if (response.responseCode === 200) {
      return response.result;
    } else {
      throw new Error(`HTTP ${response.responseCode}`);
    }
  } catch (error) {
    hilog.error(0x0000, 'MyApp', '%{public}s: %{public}s', TAG, error.message);
    throw new NetworkError('请求失败', error.code || 500);
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

### 总结

环节

技术方案

目标

错误处理

​try-catch​​/全局监听/自定义错误类型

防止崩溃,精准定位问题

日志记录

​HiLog​​ 分级输出/文件持久化/结构化日志

可追溯、可分析、保护隐私

优化实践

异步写入/环境适配日志级别/用户友好提示

平衡性能与可维护性

通过以上方案,开发者可构建高可靠、易维护的 HarmonyOS 应用。更多细节可参考:​​HarmonyOS 日志文档​​。

分享
微博
QQ
微信
回复
7天前


相关问题
元服务如何进行日志的收集与分析?
109浏览 • 1回复 待解决
HarmonyOS 如何进行邀请测试
701浏览 • 1回复 待解决
HarmonyOS 如何进行sdk升级
602浏览 • 1回复 待解决
HarmonyOS 如何进行代码检查
703浏览 • 1回复 待解决
HarmonyOS 如何进行图片裁剪
666浏览 • 1回复 待解决
HarmonyOS 请问如何进行UrlEncode
607浏览 • 1回复 待解决
HarmonyOS 如何进行音频合成
983浏览 • 1回复 待解决