鸿蒙开发:实现全局异常捕获和异常查看

前言
开发中的异常信息,我们很容易排查,直接可以在控制台中就可以查看,但是,提交给测试同学或者上线后的异常信息,我们如何获取呢?这里我们很容易想起,三方sdk,比如常见的腾讯Bugly,通过集成它,便可以收集应用的异常信息,直接在他们的后台,我们就可以排查到异常,便于我们进行针对性的解决;使用三方,很是便捷,我们也无须考虑服务器的问题,但是,需要我们付出一定的资金,即便一直免费的Bugly目前还未收费,但从官网去看,已经朝着收费的方向前进了。
收费是一方面,如何灵活的拿到错误信息后,执行我们想要的逻辑,也是自研的一个诉求,比如全局监听到异常后,重启应用,或者上传到自己的服务器,或者可以在应用内查看等等,实现一个全局异常捕获,确实有很多的有用之处。
鸿蒙中,如何实现呢?
实现起来很是简单,直接使用errorManager对象,注册监听即可,ErrorManager可以提供对错误观察器的注册和注销的能力,建议在主EntryAbility或者AbilityStage中。
异常监听功能介绍:
| 接口名称 | 说明 |
| onUnhandledException(errMsg: string): void | 系统回调接口,应用注册后,当应用产生未捕获的异常时的回调。 |
| onException?(errObject: Error): void | 系统回调接口,应用注册后,当应用产生异常上报JS层时的回调。 |
简单举例如下:
errorManager.on('error', {onUnhandledException: (errMsg) => {console.log('产生未捕获异常时的回调,onUnhandledException:', errMsg);},onException: (errorObj) => {console.log('产生异常上报JS层时的回调,onException');}
})
当有异常信息发生时,就会走以上的监听,需要注意,注册后可以捕获到应用产生的js crash,应用崩溃时进程不会退出。
除了注册之外,系统还提供了注销错误观测器,可以在onDestroy声明周期中进行。registerId就是注册时的id,可以直接赋值errorManager.on()。
errorManager.off('error', registerId, (result) => { });
以上的部分,我们只是实现了异常的监听,我们可以在上述中的方法中,进行针对的拓展,比如,异常信息存储到本地,或者上传到服务器,或者定制开发相关的异常UI查看等等,目前这些功能,我做了一层封装,希望可以帮助需要的朋友。
本文主要内容如下:
1、封装之后的catch库效果
2、catch库快速引入
3、catch库主要实现
一、封装之后的catch库效果
目前除了提供了全局异常捕获方法之外,还提供了异常查看UI,方便测试人员或者其他人员遇到异常之后,可以快速的分享给研发人员。


二、catch库快速引入
引入
方式一:在Terminal窗口中,执行如下命令安装三方包,DevEco Studio会自动在工程的oh-package.json5中自动添加三方包依赖。
建议:在使用的模块路径下进行执行命令。
ohpm install @abner/catch
方式二:在工程的oh-package.json5中设置三方包依赖,配置示例如下:
"dependencies": { "@abner/catch": "^1.0.0"}
初始化
建议在AbilityStage里或者主入口的UIAbility进行初始化。
onHandledException({context: this.context,//上下文onExceptionBack: (exception) => {//自己收集异常信息上报,比如上报到服务器或者三方}
})
属性介绍
| 属性 | 类型 | 概述 |
| context | Context | 上下文, 用于数据库和文化存储读取 |
| isExceptionSave | boolean | 异常信息是否保存到本地,默认保存 |
| isFileSave | boolean | 是否以文件形式保存,默认是数据库,true:文件,fasle:数据库 |
| faultType | FaultLogger.FaultType | 异常类型,NO_SPECIFIC 不区分故障类型(默认既是),CPP_CRASH C++程序故障类型,JS_CRASH JS程序故障类型,APP_FREEZE 应用程序卡死故障类型 |
| isExceptionIntercept | boolean | 异常信息是否拦截,默认true拦截,false不拦截,不拦截,不会走回调,也不会保存异常信息 |
| onExceptionBack | 回调函数 | 回调函数,返回异常信息,可以在这里进行上报 |
关闭全局异常
onExceptionDestroy()
查看异常信息
如果你想本地查看全局异常信息,可以在使用的地方进行调用,就会弹出异常列表页面。
点击条目:查看异常详情,左滑条目:可以删除此条异常信息,右上角点击清空:可以删除所有的异常信息
openExceptionDialog()
异常上报
如果你想自己拿到异常信息,进行上报到自己服务器或者三方,或者自行处理,可以在初始化中实现onExceptionBack回调。
三、catch库主要实现
其实catch库仅仅针对系统的全局异常做了一层封装,实现了本地异常信息的存储,实现文件形式存储和本地数据库形式存储,其它的暂无拓展。
文件存储,大家可以关注文件管理模块fs,数据库可以关注关系型数据库relationalStore。
相关文章:
鸿蒙开发:实现全局异常捕获和异常查看
前言 开发中的异常信息,我们很容易排查,直接可以在控制台中就可以查看,但是,提交给测试同学或者上线后的异常信息,我们如何获取呢?这里我们很容易想起,三方sdk,比如常见的腾讯Bugly…...
Git和GitHub Desktop(Git客户端工具)下载安装教程
不说废话,直接开始。下载网址:https://git-scm.com/ 一.GIT下载 1.点击downloads 2.自己选择自己需要配置的版本 我是windows,所以选择的windows版本的安装 3.根据自己电脑的系统下载软件 我的是64位,选择64位安装 ps :下载很慢…...
Linux经常使用命令汇总和总结
Linux经常使用命令汇总和总结 文章目录 Linux经常使用命令汇总和总结一、基本命令二、目录操作命令三、文件操作命令四、压缩文件操作五、查找命令六、su、sudo七、系统服务八、网络管理九、定时任务指令crontab 配置十、其他命令 一、基本命令 1.1 关机和重启 关机 shutdown …...
three.js 灯光
环境光探针(AmbientLightProbe) 光照探针是一种在3D场景中添加光源的另一种方法。 AmbientLightProbe 是场景中单个环境光的光照估算数据。 有关光照探针的更多信息,请转到 LightProbe 。 构造函数 AmbientLightProbe( color : Color, int…...
ELK日志收集
目前,各个微服务系统的日志都保存在各自指定的目录中,如果这些微服务部署在不同的服务器上,那么日志文件也是分散在各自的服务器上。分散的日志不利于我们快速通过日志定位问题,我们可以借助ELK来收集各个微服务系统的日志并集中展…...
常见docker命令
1、查询已安装docker中某个image依赖包 docker run -it --rm --name my-python-container 【python37:v001】 /bin/bash 【】改成自己环境名字 docker run -it --name lane python37_test:v006 /bin/bash lane是容器名字,python37_test:v006 是镜像名 开启容器 do…...
测试新人刚入行,该如何规划以后的发展路径?
作为一个刚入行的测试新人,应该如何规划自己的职业发展路径?如何规划自己的技术路线?软件测试的段位都有哪些?他们之间的薪资差异如何? 听说这些问题,是目前想要入行软件测试的同学们最关心的。那么我们今…...
Boosting Object Detection with Zero-Shot Day-Night Domain Adaptation
摘要:低亮度场景检测是一个小众且重要的方向,首先在于数据集和过往的研究都集中在光照充足的环境下,其次如果使用传统的训练方法的话由于训练难度大,模型效果也不会很好,有幸的是,现在关于低亮度的研究已经…...
Chromium html<lable>c++接口定义
HTML <label> 元素(标签)表示用户界面中某个元素的说明。 1、<label> 在html_tag_names.json5中接口定义: (third_party\blink\renderer\core\html\html_tag_names.json5) {name: "label",inte…...
QT中中文显示乱码问题
在VS2013中用QT开发GUI应用程序,Qt中显示中文乱码 一: //解决QT中中文显示乱码问题 #pragma execution_character_set("utf-8") 二:在main函数中添加以下代码: #include <QTextCodec>void main() {QTextCod…...
[面试常见]Javascript基础知识
#1024程序员节|征文# Object.assign 和对象扩展运算符有什么区别?是深拷贝还是浅拷贝? 都进行浅拷贝,只赋值对象的第一层属性,而不会递归复制整个对象结构 **const mergedObj Object.assign({},obj1,obj2) JavaScript 中 Map 和 Object 的区别是什么?…...
使用注解@ExcelIgnoreUnannotated实现了在导出 Excel 时忽略没有被标注的字段
ExcelIgnoreUnannotated 注解用于在使用 Apache POI 或其他 Excel 处理库时,指示在导出 Excel 时忽略没有被标注的字段。这意味着只有被特定注解(如 ExcelProperty)标注的字段会被处理和导出。 作用 简化导出过程:只导出需要的字…...
线程的同步
目录 引入 认识条件变量 快速认识接口编辑 认识条件变量编辑 测试代码编辑 生产消费模型 为何要使用生产者消费者模型 理解 编写生产消费模型 BlockingQueue 单生产单消费 多生产多消费 引入 同步:在保证数据安全的前提下,让线程…...
【启明智显分享】ZX7981PG/ZX7981PM融入官方OpenWrt,启明智显SDK/官方OpenWrt任由选择!
好消息!好消息!启明智显ZX7981PG和ZX7981PM正式融入官方 OpenWrt 的大家庭啦!现在开发者不仅可以基于启明智显的SDK进行二次开发,还可以直接应用官方OpenWrt以及我们的开源资料进行开发! 借助OpenWrt的强大生态&…...
如何用java发送包含表格形式的邮件
问题: 如何用java发送包含表格形式的邮件? 方法: 发用freemaker工具来替换html的表格变量,从而动态生成了html。然后再发送这个html格式(不能用纯文本)文本即可。 优化流程: 1、准备模板&#x…...
讲个故事:关于一次接口性能优化的心里路程
这是一个程序猿写的第一个故事,请各位懂行的客官静下心来,慢慢品读。就知道我为什么要单独写一个文章来记录这次过程了,因为实在是太坎坷了...... 背景介绍 近期项目投产时遇到一个问题,投产后在验证时发现大部分用户系统登…...
Centos7升级到openssh9.9
openssh9.9 是2024.9.20出的最新版ssh。因为客户扫描出一大堆centos7的漏洞,全是这个openssh的,好多补丁,所以索性升级到最新版。 需要自己制作rpm包,这个我是不懂,照这个来: Linux服务器升级openssh9.9最…...
使用 STM32F407 串口实现 485 通信
准备工作 了解485通信基本概念与原理:RS485通信详解_485通讯de接什么口-CSDN博客 安装编译软件:keil uVision 5.6 软件资料:STM32CubeF4 固件包,正点原子RS485通信例程 参考视频:第26讲 基础篇-新建H…...
基于NERF技术重建学习笔记
NeRF(Neural Radiance Fields)是一种用于3D场景重建的神经网络模型,能够从2D图像生成逼真的3D渲染效果。它将场景表征为一个连续的5D函数,利用了体积渲染和神经网络的结合,通过学习光线穿过空间时的颜色和密度来重建场…...
webView 支持全屏播放
webView 支持全屏播放 直接上代码 public class CustomFullScreenWebViewClient extends WebChromeClient {WebView webView;Context context;/*** 视频全屏参数*/protected static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS new FrameLayout.LayoutParams(ViewG…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
