Android全局异常捕获

在开发过程中我们会使用try{}catch捕获一些异常,不过我们毕竟不能面面俱到,所以总会有一些异常在我们想不到的位置发生,然后程序就崩溃了,于是赶紧连上电脑复现bug,有的可以复现有的一时还复现不了,然后就各种手忙脚乱。

这时候我们就需要有一个全局异常捕获器,当有异常发生时,全局异常捕获器会输出异常信息,然后我们可以设置将异常信息保存到本地或者是上传服务器,方便我们快速的定位问题,不用为重新复现问题而搞的焦头烂额。

一、了解UncaughtExceptionHanlder

这里我们介绍使用UncaughtExceptionHandler来设置全局异常捕获器。首先我们来看看这个类。

源码:

@FunctionalInterface
public interface UncaughtExceptionHandler {
/**
* Method invoked when the given thread terminates due to the
* given uncaught exception.
* <p>Any exception thrown by this method will be ignored by the
* Java Virtual Machine.
* @param t the thread
* @param e the exception
*/
void uncaughtException(Thread t, Throwable e);
}
UncaughtExceptionHandler是java.Thread类中定义的一个接口。

作用:
用来处理在程序中未被捕获的异常。(如果程序中已经自己设置了try{}catch,则不会执行这个方法)。

二、实现方法

1.定义异常捕获类
新建MyCrashHandler 实现UncaughtExptionHandler接口:

public class MyCrashHandler implements Thread.UncaughtExceptionHandler {@Overridepublic void uncaughtException(Thread t, Throwable e) {//在这里处理异常信息}
}

2.将得到的异常数据保存到本地(也可以上传服务器,这里根据需求自行解决)

/**
* 保存错误信息到文件中
* @param ex
*/
private void saveCrashInfoToFile(Throwable ex) {Writer writer = new StringWriter();PrintWriter printWriter = new PrintWriter(writer);ex.printStackTrace(printWriter);Throwable exCause = ex.getCause();while (exCause != null) {exCause.printStackTrace(printWriter);exCause =exCause.getCause();}printWriter.close();long timeMillis = System.currentTimeMillis();//错误日志文件名称String fileName = "crash-" + timeMillis + ".log";//判断sd卡可正常使用if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//文件存储位置String path = Environment.getExternalStorageDirectory().getPath() + "/crash_logInfo/";File fl = new File(path);//创建文件夹if(!fl.exists()) {fl.mkdirs();}try {FileOutputStream fileOutputStream = new FileOutputStream(path + fileName);fileOutputStream.write(writer.toString().getBytes());fileOutputStream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

不要忘记配置读写权限:

<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 从SDCard读入数据权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

3.将该异常类设置为系统默认异常处理类,然后出现异常时,则该类会处理异常。

//设置该类为系统默认处理类
Thread.setDefaultUncaughtExceptionHandler(this);

4.在Application中使用:

MyCrashHandler mycrashHandler = new MyCrashHandler();
Thread.setDefaultUncaughtExceptionHandler(mycrashHandler);

第3步可以放到Application中,也可以在自身类里初始化好。这里只讲述思路。

到这里为止,就已经完成了全局捕获器的创建和调用,如果出现未捕获的异常,异常信息就会保存到sd卡内。这样就方便我们的查找。

当然上面的代码只是讲解思路,所以使用的时候,我们需要补充和完善,比如bug信息文件里添加手机信息,在保存到本地后将文件上传服务器等等操作,这些都可以根据需求自行完善。这里贴出我自己使用的一部分代码。

public class MyCrashHandler implements Thread.UncaughtExceptionHandler {private Thread.UncaughtExceptionHandler mDefaultHandler;private Context mcontext;private static MyCrashHandler myCrashHandler;private MyCrashHandler(){}public static synchronized MyCrashHandler newInstance() {if(myCrashHandler == null)myCrashHandler = new MyCrashHandler();return myCrashHandler;}/*** 初始化* @param context*/public void init(Context context){mcontext = context;//系统默认处理类mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();//设置该类为系统默认处理类Thread.setDefaultUncaughtExceptionHandler(this);}@Overridepublic void uncaughtException(Thread t, Throwable e) {if(!handleExample(e) && mDefaultHandler != null) { //判断异常是否已经被处理mDefaultHandler.uncaughtException(t, e);}else {try {Thread.sleep(3000);} catch (InterruptedException e1) {e1.printStackTrace();}//退出程序android.os.Process.killProcess(android.os.Process.myPid());System.exit(1);}}/*** 提示用户出现异常* 将异常信息保存* @param ex* @return*/private boolean handleExample(Throwable ex) {if(ex == null)return false;new Thread(() -> {Looper.prepare();Toast.makeText(mcontext, "很抱歉,程序出现异常,即将退出", Toast.LENGTH_SHORT).show();Looper.loop();}).start();//手机设备参数信息collectDeviceInfo(mcontext);saveCrashInfoToFile(ex);return true;}/*** 设备信息* @param mcontext*/private void collectDeviceInfo(Context mcontext) {}/*** 保存错误信息到文件中* @param ex*/private void saveCrashInfoToFile(Throwable ex) {Writer writer = new StringWriter();PrintWriter printWriter = new PrintWriter(writer);ex.printStackTrace(printWriter);Throwable exCause = ex.getCause();while (exCause != null) {exCause.printStackTrace(printWriter);exCause = exCause.getCause();}printWriter.close();long timeMillis = System.currentTimeMillis();//错误日志文件名称String fileName = "crash-" + timeMillis + ".log";//判断sd卡可正常使用if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//文件存储位置String path = Environment.getExternalStorageDirectory().getPath() + "/crash_logInfo/";File fl = new File(path);//创建文件夹if(!fl.exists()) {fl.mkdirs();}try {FileOutputStream fileOutputStream = new FileOutputStream(path + fileName);fileOutputStream.write(writer.toString().getBytes());fileOutputStream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
}


链接:https://www.jianshu.com/p/bafaea706eec

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/16541.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络 (3)计算机网络的性能

一、计算机网络性能指标 速率&#xff1a; 速率是计算机网络中最重要的性能指标之一&#xff0c;它指的是数据的传送速率&#xff0c;也称为数据率&#xff08;Data Rate&#xff09;或比特率&#xff08;Bit Rate&#xff09;。速率的单位是比特/秒&#xff08;bit/s&#xff…

CAP与BASE分布式理论

CAP理论 C&#xff1a;Consistency 一致性&#xff1a;指强一致性&#xff0c;分布式系统中的所有节点在同一时刻具有同样的值、都是最新的数据副本&#xff0c;一致性保证了不管向哪台服务器写入数据&#xff0c;其他的服务器能实时同步数据 强一致性&#xff1a;写入数据的时…

【Java基础知识系列】之Java类的初始化顺序

前言 类的初始化顺序 简单场景 代码示例 public class Person {private String name initName();private String initName() {System.out.println("【父类】初始化实例变量name");return "【父类】史蒂夫";}private int age;private static int staticVa…

探索大规模语言模型(LLM)在心理健康护理领域中的应用与潜力

概述 心理健康是公共卫生最重要的领域之一。根据美国国家精神卫生研究所&#xff08;NIMH&#xff09;的数据&#xff0c;到 2021 年&#xff0c;22.8% 的美国成年人将患上某种形式的精神疾病。在全球范围内&#xff0c;精神疾病占非致命性疾病负担的 30%&#xff0c;并被世界…

解决 idea windows 设置maven离线模式之后,maven继续请求远程仓库

在内网开发的时候经常遇到没有办法来链接远程仓库的情况&#xff0c;这个时候需要设置maven的离线模式。 idea windows 设置maven离线模式之后&#xff0c;maven继续请求远程仓库 当设置完离线模式之后&#xff0c;有的时候执行maven的命令会报错&#xff0c;提示请求远程失败…

卷积神经网络 (CNN)

代码功能 网络结构&#xff1a; 卷积层&#xff1a; 两个卷积层&#xff0c;每个卷积层后接 ReLU 激活函数。 最大池化层用于降低维度。 全连接层&#xff1a; 使用一个隐藏层&#xff08;128 个神经元&#xff09;和一个输出层&#xff08;10 类分类任务&#xff09;。 数据集…

等保二级需要哪些安全设备?

在信息化高速发展的今天&#xff0c;服务器的安全性成为了企业乃至国家信息安全的重要基石。等保二级&#xff0c;作为信息安全等级保护制度中的一个关键环节&#xff0c;对服务器的安全防护提出了明确要求。本文将详细阐述服务器等保二级所需的各种安全设备&#xff0c;旨在为…

C++【深入项目-检测键盘】

神马是检测键盘&#xff0c;就是让编辑器可以检测键盘按下了什么按键&#xff0c;我们先科普复习检测键盘 。 检测键盘需要用到一些函数&#xff0c;请见下&#xff1a; ! KEY_DOWN( 80 ) 这个代码是检测按下键盘上P按键。那80是什么&#xff1f;原来是对应按键的&#xff0…

问题An object named ‘ResNetArcFace‘ was already registered in ‘arch‘ registry!

在安装 GFPGAN 的时候&#xff0c;一切都顺利&#xff0c;但是执行的时候出现了错误&#xff0c;哦还有一个问题&#xff0c; 问题一 就是如果basicsr安装不成功可以执行如下命令 pip install -i https://mirrors.aliyun.com/pypi/simple tb-nightly pip install -i https:/…

Leecode刷题C语言之最少翻转次数使二进制矩阵回文①

执行结果:通过 执行用时和内存消耗如下&#xff1a; 题目&#xff1a;最少翻转次数使二进制矩阵回文① 给你一个 m x n 的二进制矩阵 grid 。如果矩阵中一行或者一列从前往后与从后往前读是一样的&#xff0c;那么我们称这一行或者这一列是 回文 的。你可以将 grid 中任意格子…

K8S containerd拉取harbor镜像

前言 接前面的环境 K8S 1.24以后开始启用docker作为CRI&#xff0c;这里用containerd拉取 正文 vim /etc/containerd/config.toml #修改内容如下 #sandbox_image "registry.aliyuncs.com/google_containers/pause:3.10" systemd_cgroup true [plugins."io.…

三、计算机视觉_01图像的基本操作

0 前言 图像的读取和处理是计算机视觉领域中的一个基本任务&#xff0c;在Python中&#xff0c;有几个流行的库可以用来读取和处理图像数据 0.1 Matplotlib介绍 Matplotlib是Python中一个非常流行的绘图库&#xff0c;它通常用于数据可视化&#xff0c;虽然它不是专门的图像…

Liunx-Ubuntu22.04.1系统下配置Anaconda+pycharm+pytorch-gpu环境配置

这里写自定义目录标题 Liunx-Ubuntu22.04.1系统下配置Anacondapycharmpytorch-gpu环境配置一、Anaconda3配置1.Anaconda安装2.Anaconda更新3.Anaconda删除 二、pycharm配置1.pycharm安装 三、pytorch配置 Liunx-Ubuntu22.04.1系统下配置Anacondapycharmpytorch-gpu环境配置 一…

[Mysql] Mysql的多表查询----多表关系(下)

4、操作 方式二&#xff1a;创建表之后设置外键约束 外键约束也可以在修改表时添加&#xff0c;但是添加外键约束的前提是&#xff1a;从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。 语法&#xff1a; alter table <从表名> add constr…

WukongCRM:github高分开源项目,基于微服务架构 +vue ElementUI的前后端分离CRM系统

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 WukongCRM 是一款基于 Spring Cloud Alibaba 微服务架构和 Vue ElementUI 前后端分离的 CRM 系统。它在中国开源管理软件行业具有较高的知名度&#x…

【C#】C#编程入门指南:构建你的.NET开发基础

文章目录 前言&#xff1a;1. C# 开发环境 VS的基本熟悉2. 解决方案与项目的关系3. 编辑、编译、链接、运行4. 托管代码和CLR4.1 CLR&#xff1a;4.2 C# 代码第编译过程&#xff08;两次编译的&#xff09; 5. 命名空间6. 类的组成与分析7. C# 的数据类型7.1 值类型7.2 引用类型…

文心一言 VS 讯飞星火 VS chatgpt (392)-- 算法导论25.1 6题

六、假定我们还希望在本节所讨论的算法里计算出最短路径上的结点。说明如何在 O ( n 3 ) O(n^3) O(n3) 时间内从已经计算出的最短路径权重矩阵 L L L 计算出前驱矩阵Ⅱ。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 要计算前驱矩阵 $ \pi $&#xff0c;我们…

《网络硬件设备完全技术宝典》

《网络硬件设备完全技术宝典》 网卡 集线器 交换机 路由器 双绞线 光缆 无线接入点AP 交换机技术与选择策略 冗余链路技术 由于物理链路和网络模块的损坏都将导致网络链路的失败&#xff0c;因此两个设备之间&#xff0c;特别是核心交换机与汇聚交换机之间的单链路…

CC3学习记录

&#x1f338; CC3 之前学习到的cc1和cc6都是通过Runtime进行命令执行的&#xff0c;如果Runtime被加入黑名单的话&#xff0c;整个链子也就失效了。而cc3则是通过动态类加载机制进行任意代码执行的。 &#x1f338; 版本限制 JDK版本&#xff1a;8u65 Commons-Collections…

机器学习 ---线性回归

目录 摘要&#xff1a; 一、简单线性回归与多元线性回归 1、简单线性回归 2、多元线性回归 3、残差 二、线性回归的正规方程解 1、线性回归训练流程 2、线性回归的正规方程解 &#xff08;1&#xff09;适用场景 &#xff08;2&#xff09;正规方程解的公式 三、衡量…