当前位置: 首页 > news >正文

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler它是Thread的子类(就是package java.lang;线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都记录到文件存到本地用来分析问题。当然也可以在客户授权同意的情况下将这些错误信息或者缓存的文件发送到服务端进行分析。

本文只实现获取错误信息并存文件,如需上传请自己增加网络请求。

核心代码就是自己实现Thread.UncaughtExceptionHandler并重写uncaughtException方法,然后调用Thread的静态方法setDefaultUncaughtExceptionHandler将自己实现类对象设置进去,等程序发生crash闪退的时候系统会调用uncaughtException方法并传递错误信息。

第一步实现Thread.UncaughtExceptionHandler并完成信息保存

public class CrashHandler implements Thread.UncaughtExceptionHandler {private static final String CRASH_DIR = "crash";private static final String FILE_NAME = "crash_log.txt";private static final SimpleDateFormat DATE_FORMAT =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());private static final String TAG = "CrashHandler";private Context mContext;private Thread.UncaughtExceptionHandler mDefaultHandler;public static void init(Context context) {int i1 = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);int i2 = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);if (i1 == PackageManager.PERMISSION_GRANTED && i2 == PackageManager.PERMISSION_GRANTED) {//已有权限CrashHandler handler = new CrashHandler(context);Thread.setDefaultUncaughtExceptionHandler(handler);} else {Log.e(TAG, "onClick: 无权限需申请");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//                context.requestPermissions(permissions, 1000);}else {// 低版本设备}}}private CrashHandler(Context context) {mContext = context.getApplicationContext();mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();}@Overridepublic void uncaughtException(Thread thread, Throwable ex) {Log.e(TAG, "uncaughtException:  抛异常");saveCrashInfo(ex);mDefaultHandler.uncaughtException(thread, ex);}private void saveCrashInfo(Throwable ex) {String time = DATE_FORMAT.format(new Date());String deviceInfo = getDeviceInfo();String crashInfo = getCrashInfo(ex);File externalDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS+"/"+CRASH_DIR);
//        File dir = new File(Environment.getExternalStorageDirectory(), CRASH_DIR);if (!externalDir.exists()) {externalDir.mkdirs();}
//        File dir = new File(Environment.getExternalStorageDirectory(), CRASH_DIR);
//        if (!dir.exists()) {
//            dir.mkdirs();
//        }File file = new File(externalDir, FILE_NAME);try (PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file, true)))) {pw.println("========== Crash Log ==========");pw.println("Time: " + time);pw.println(deviceInfo);pw.println(crashInfo);pw.println();pw.println(); // 空行分隔每次崩溃记录} catch (IOException e) {e.printStackTrace();}}private String getDeviceInfo() {return "Model: " + Build.MODEL + "\n" +"Brand: " + Build.BRAND + "\n" +"Android SDK: " + Build.VERSION.SDK_INT + "\n" +"Version: " + Build.VERSION.RELEASE;}private String getCrashInfo(Throwable ex) {StringBuilder sb = new StringBuilder();sb.append("Exception: ").append(ex.getClass().getName()).append("\n");sb.append("Message: ").append(ex.getMessage()).append("\n");StackTraceElement[] stackTrace = ex.getStackTrace();for (StackTraceElement element : stackTrace) {sb.append("\tat ").append(element.toString()).append("\n");}return sb.toString();}
注意想创建文件夹要使用路径不能再是Environment.getExternalStorageDirectory()。否则可能无法成功指定到文件。

第二、实现类调用最好在Application的onCreate中实现,因为是全局的越早开始检测越好。

@Override
public void onCreate() {super.onCreate();context = this;Log.e(TAG, "onCreate: ");CrashHandler.init(this);
}
  • 第三、主动创建一个异常

  • Log.e(TAG, "error: "+ 1/0 );

    第四、实现效果:

相关文章:

  • android关于pthread的使用过程
  • ArkUI-X与Android桥接通信之方法回调
  • ArkUI-X与Android桥接通信之消息通信
  • 在Unity中Update和Fixedupdate有什么区别
  • PHP中如何定义常量以及常量和变量的主要区别
  • 【Pikachu】PHP反序列化RCE实战
  • 讲述我的plc自学之路 第十三章
  • Unity VR/MR开发-开发环境准备
  • 大数据学习(133)-Hive数据分析2
  • 行为设计模式之Iterator(迭代器)
  • ​**​CID字体​**​ 和 ​**​Simple字体​**​
  • 新手如何选择前端框架?
  • 行为型设计模式之Mediator(中介者)
  • 【Redis】持久化
  • 苍穹外卖-day01
  • 告别 @MockBean!在 Spring Boot 3.2+ 中使用 @MockitoBean 进行单元测试
  • NLP学习路线图(三十三): 文本分类
  • redis--黑马点评--分布式锁实现详解
  • uni-app学习笔记二十七--设置底部菜单TabBar的样式
  • AWS 公开数据集下载与操作说明
  • 深圳网站建设外包公司/百度明星搜索量排行榜
  • 妇科医院网站建设怎么做/seo推广官网
  • b站入口2023已更新/可以访问违规网站的浏览器
  • 淄博高端网站建设/网站优化网站优化
  • 互联网网站建设公司/百度seo点击排名优化
  • 大连网站的公司/成都最新热门事件