写点什么

HarmonyOSNext 崩溃急救指南:全局监听 + 同步退出 = 优雅保命!

作者:Turing_010
  • 2025-06-26
    广东
  • 本文字数:1846 字

    阅读完需:约 6 分钟

HarmonyOSNext 崩溃急救指南:全局监听+同步退出 = 优雅保命!

HarmonyOSNext 崩溃急救指南:全局监听+同步退出 = 优雅保命!

##Harmony OS Next ##Ark Ts ##教育

本文适用于教育科普行业进行学习,有错误之处请指出我会修改。

📝 为什么需要错误管理? 当应用代码有坑爹的规范问题或隐藏 bug 时,用户端会出现闪退/卡死等糟心体验!更头疼的是🤯:错误日志默认只存在用户手机里,开发者想查日志?门都没有!

👉 终极方案:用errorManager在应用崩溃前,把错误信息嗖嗖嗖传到你的服务器!


⚡️ 核心功能速览表


🚨 错误管理全家桶接口

1️⃣ 错误监听基础套餐

 // 注册监听(同步接口!) errorManager.on(   type: "error",    observer: {     onUnhandledException: (errMsg: string) => void // 未捕获的异常     onException?: (errObject: Error) => void      // JS层异常上报   } ): number // 返回监听ID! ​ // 注销监听(二选一写法) errorManager.off("error", id)                  // Promise写法 errorManager.off("error", id, (result)=>{...}) // Callback写法
复制代码

2️⃣ 王炸推荐:全局监听⭐

 // 一次注册全局生效yyds! errorManager.on('globalErrorOccurred', (error: GlobalError) => {   console.log(`崩溃了!原因👉 ${error.message}`)   process.exit(0) // 立刻躺平! }) ​ // 注销 errorManager.off('globalErrorOccurred', observer)
复制代码

3️⃣ 专治 Promise 摆烂

 errorManager.on('globalUnhandledRejectionDetected', (reject) => {   console.warn(`⚠️ Promise造反啦:${reject.reason}`)   // 处理完记得退出! })
复制代码

🛠️ 实战代码示例

🎯 场景 1:单线程监听(经典模式)

 import { AbilityConstant, errorManager, UIAbility } from '@kit.AbilityKit' import process from '@ohos.process' ​ // 重点!定义崩溃回调 const crashHandler = {   onException: (error) => {     console.error(`🔥 完蛋了:${error.name} - ${error.message}`)     // 必须同步退出!否则无限崩溃循环     new process.ProcessManager().exit(0)    } } ​ export default class EntryAbility extends UIAbility {   private registerId?: number ​   onCreate() {     // 注册监听     this.registerId = errorManager.on("error", crashHandler)   } ​   onDestroy() {     // 记住要注销监听哦!     errorManager.off("error", this.registerId, (res) => {       console.log(res.code === 0 ? '注销成功🎉' : '注销失败💥')     })   } }
复制代码

🌍 场景 2:全局监听(省心推荐)

 // 崩溃处理函数 function globalCrashHandler(error) {   console.error(`🚨 全局翻车!详情:`)   console.table({     错误类型: error.name,      错误信息: error.message,     调用栈: error.stack?.slice(0, 100) + '...'   })      // 马上退出保平安!   process.exit(0)  } ​ export default class EntryAbility extends UIAbility {   onCreate() {     // 一句话搞定全局监听!     errorManager.on('globalErrorOccurred', globalCrashHandler)   } ​   onDestroy() {     // 优雅注销     errorManager.off('globalErrorOccurred', globalCrashHandler)   } }
复制代码

⏱ 场景 3:主线程卡死检测

 // 定义超时处理器 const freezeHandler = () => {   console.warn("主线程卡成狗了🐶!快优化代码!") } ​ export default class EntryAbility {   onCreate() {     // 500ms是卡死阈值(单位毫秒)     errorManager.on('loopObserver', 500, freezeHandler)   } ​   // 页面关闭时别忘了卸货!   onDestroy() {     errorManager.off('loopObserver', freezeHandler)   } }
复制代码

💡 避坑指南(血泪总结!)

  1. 必加退出语句 在异常回调末尾一定要process.exit(0)!否则可能触发死亡连环崩👻

     // 正确姿势✅  onException: (error) => {   reportToServer(error) // 先上报   process.exit(0)     // 再退出  }

  2. 主线程限制 这些监听器只能主线程调用⬇️

     loopObserver   // 消息处理耗时  freezeObserver // 主线程冻结

  3. 全局监听优势


❗ 常见错误码大全


最后敲黑板🚨:

如果只是收集日志👉用hiappevent 如果为了防止崩溃👉用errorManager+同步退出 记住这个万能公式: ​​发现异常 → 上报日志 → 立刻退出 = 优雅崩溃处理 ✅​


用户头像

Turing_010

关注

还未添加个人签名 2025-05-22 加入

还未添加个人简介

评论

发布
暂无评论
HarmonyOSNext 崩溃急救指南:全局监听+同步退出 = 优雅保命!_Turing_010_InfoQ写作社区