HarmonyOSNext 崩溃急救指南:全局监听+同步退出 = 优雅保命!
2025-06-26 20:07:03
115次阅读
0个评论
HarmonyOSNext 崩溃急救指南:全局监听+同步退出 = 优雅保命!
##Harmony OS Next ##Ark Ts ##教育
本文适用于教育科普行业进行学习,有错误之处请指出我会修改。
📝 为什么需要错误管理? 当应用代码有坑爹的规范问题或隐藏bug时,用户端会出现闪退/卡死等糟心体验!更头疼的是🤯:错误日志默认只存在用户手机里,开发者想查日志?门都没有!
👉 终极方案:用errorManager
在应用崩溃前,把错误信息嗖嗖嗖传到你的服务器!
⚡️ 核心功能速览表
监听类型 | 适用场景 | 特!别!注!意! |
---|---|---|
单线程错误监听 | 普通JS异常捕获 | 必须同步退出!否则反复崩溃💥 |
全局错误监听 | 监控整个进程的异常(强推⭐) | 一次注册,全局生效✅ |
Promise异常监听 | 未处理的Promise错误 | 和全局监听一样好用✨ |
主线程卡死监控 | 检测事件处理超时 | 只能在主线程调用⚠️ |
应用冻结监听 | 发现主线程冻成冰块❄️ | 覆盖式注册,后浪拍前浪🌊 |
🚨 错误管理全家桶接口
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)
}
}
💡 避坑指南(血泪总结!)
-
必加退出语句 在异常回调末尾一定要
process.exit(0)
!否则可能触发死亡连环崩👻// 正确姿势✅ onException: (error) => { reportToServer(error) // 先上报 process.exit(0) // 再退出 }
-
主线程限制 这些监听器只能主线程调用⬇️
loopObserver // 消息处理耗时 freezeObserver // 主线程冻结
-
全局监听优势
对比项 单线程监听 全局监听 注册方式 需维护监听ID 直接传函数👍 生效范围 当前上下文 整个进程🌐 使用复杂度 中 极简✨
❗ 常见错误码大全
错误码 | 含义 | 自查重点 |
---|---|---|
0 | 操作成功🎉 | 一切正常 |
-1 | 监听ID不存在 | 检查是否重复注销 |
-2 | 参数错误 | 查类型/数量/必填项 |
最后敲黑板🚨:
如果只是收集日志👉用
hiappevent
如果为了防止崩溃👉用errorManager+同步退出
记住这个万能公式: 发现异常 → 上报日志 → 立刻退出 = 优雅崩溃处理 ✅
00
- 0回答
- 0粉丝
- 0关注
相关话题
- 《HarmonyOSNext应用崩溃自救指南:零数据丢失的故障恢复黑科技》
- HarmonyOSNext列表开发指南
- OpenHarmony: 如何主动退出整个应用
- 鸿蒙实战开发:网络层的艺术——优雅封装与搭建指南(上)
- 鸿蒙实战开发:网络层的艺术——优雅封装与搭建指南(中)
- 鸿蒙实战开发:网络层的艺术——优雅封装与搭建指南(下)
- 鸿蒙开发:wrapBuilder来封装全局@Builder
- HarmonyOSNext动画:一学就会的“动感魔法”指南!
- HSP与HAR:HarmonyOSNext共享包开发终极指南
- 「HarmonyOSNext性能调优秘籍:HiTraceMeter全场景追踪指南」
- OpenHarmony 如何优雅的编写注释
- 鸿蒙开发:全局异常捕获和异常信息查看
- Harmony 状态监听 @Monitor和@Computed
- 实现文件内容数据同步
- HarmonyOS Next 如何优雅的编写注释