1.Thread.UncaughtExceptionHandler

  java里有很多异常如:空指针异常,越界异常,数值转换异常,除0异常,数据库异常等等。如果自己没有try / catch 那么线程就崩溃。

  并不能对所有代码都try/catch,如果代码产生了未捕获的异常,又不想让程序崩溃,或者在崩溃之前要做一些收尾工作。怎么办?

  Thread.UncaughtExceptionHandler 类可以解决这个问题,当有未捕获异常时,它的 public void uncaughtException(Thread t, Throwable e) 方法会被调用,参数包含了崩溃的线程及相应的异常信息。

  Thread类中的 public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh) 方法指定接收未捕获异常处理类。通常在 Application 里指定一个生命周期很长的未捕获异常处理类。

2.示例

2.1 自定义Thread.UncaughtExceptionHandler

 import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import java.io.File
import java.io.PrintWriter
import java.text.SimpleDateFormat
import java.util.* class CrashHandler(val context: Context) : Thread.UncaughtExceptionHandler { private lateinit var default : Thread.UncaughtExceptionHandler
override fun uncaughtException(t: Thread, e: Throwable) {
e.printStackTrace()
writeLog(t,e)
if (::default.isInitialized){
default.uncaughtException(t,e)
}
} fun start(){
default = Thread.getDefaultUncaughtExceptionHandler()
Thread.setDefaultUncaughtExceptionHandler(this)
} fun writeLog(t: Thread, e: Throwable){
val log = context.getExternalFilesDir("")?.absolutePath + "/crash.log"
val time = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())
try {
val file = File(log)
val pw = PrintWriter(file,"UTF-8")
pw.println("time : $time")
pw.println("Thread : name = ${t.name} ,priority = ${t.priority} , pid = ${t.id}")
writePhoneInfo(pw)
e.printStackTrace(pw)
pw.close()
}catch (e : Exception){
e.printStackTrace()
}
}
fun writePhoneInfo(pw : PrintWriter) {
val pm = context.getPackageManager()
val pi = pm.getPackageInfo(context.packageName,PackageManager.GET_ACTIVITIES) pw.println("app version : ${pi.versionName}")
pw.println("android ver : ${Build.VERSION.RELEASE}")
pw.println("sdk version : ${Build.VERSION.SDK_INT}")
pw.println("product : ${Build.PRODUCT}") pw.println("vendor : ${Build.MANUFACTURER}")
pw.println("brand : ${Build.BRAND}")
pw.println("model : ${Build.MODEL}")
pw.println("hardware : ${Build.HARDWARE}") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
var abis = ""
for (abi in Build.SUPPORTED_ABIS){
abis += "$abi,"
}
pw.println("CPU_abis : ${abis}")
}else{
pw.println("CPU_abi : ${Build.CPU_ABI}")
}
}
}

如图:

2.2 在application里注册

     lateinit var crash      :   CrashHandler
fun crashHandler(){
crash = CrashHandler(context = applicationContext)
crash.start()
}

2.3 在自定义的线程中注册

  private void init(){

         new Thread(){
@Override
public void run() {
setUncaughtExceptionHandler(crashHandler);
int num = / ;
}
}.start();
}
public CrashHandler crashHandler = new CrashHandler();
public class CrashHandler implements Thread.UncaughtExceptionHandler {
final String TAG = "CrashHandler"; @Override
public void uncaughtException(Thread t, Throwable e) {
e.printStackTrace();
Log.e(TAG, "uncaughtException: " + e.getMessage() + " thread = " + t.getId());
if (t.getId() == ){
//...
}
//异常信息收集
//应用程序信息收集
//保存错误报告文件到文件。
}
}

android 捕获未try的异常、抓取崩溃日志的更多相关文章

  1. Android--iOS抓取崩溃日志

    android闪退获取日志方法: 1.下载adb工具包 2.注意事项 请确保电脑上只连接了一台手机设备(最好只连接一条USB线),同时确保手机已开启USB调试模式(可通过手机助手查看连接状态) 3.A ...

  2. android 捕获未try的异常

    1.Thread.UncaughtExceptionHandler java里有很多异常如:空指针异常,越界异常,数值转换异常,除0异常,数据库异常等等.如果自己没有try / catch 那么线程就 ...

  3. 如何抓取崩溃的log日志

    4.手机录屏工具的推荐 Andriod:录屏大师,易录屏等等. iOS:AirPlayer,iTools. 5.如何抓取崩溃的log日志? android闪退获取日志方法: 1.下载adb工具包 2. ...

  4. 【应用服务 App Service】App Service中抓取网络日志

    问题描述 众所周知,Azure App Service是一种PaaS服务,也就是说,IaaS层面的所有内容都由平台维护,所以使用App Service的我们根本无法触碰到远行程序的虚拟机(VM), 所 ...

  5. 【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志

    问题描述 在App Service For Windows的环境中,我们可以通过ArmClient 工具发送POST请求在Web应用的实例中抓取网络日志,但是在App Service For Linu ...

  6. android开发之应用Crash自动抓取Log_自动保存崩溃日志到本地

    http://blog.csdn.net/jason0539/article/details/45602655 应用发生crash之后要查看log,判断问题出在什么地方,可是一旦应用发布出去,就要想办 ...

  7. WPF捕获未处理的异常

     WPF程序中,对于异常的捕获一般使用try/catch块.就像程序中的bug一样,很难保证程序中所有的异常都能够通过try/catch捕获.如果异常没有被捕获,轻则影响用户体验,严重时会导致数据丢失 ...

  8. C# WinForm捕获未处理的异常

    using System; using System.Collections.Generic; using System.Windows.Forms; using System.IO; namespa ...

  9. android抓取logcat日志的方法

    这几天帮忙测试一个APP,报告结果需要提交日志文件,于是百度了下安卓的获取日志方法,其实很简单,7个步骤搞定,下面把我的总结分享给大家. 1.下载adb工具包 https://pan.baidu.co ...

随机推荐

  1. 笨办法学python3练习代码ex18.py

    #命名.变量.代码.函数 #this one is like your scripts with argv def print_two(*args): arg1, arg2 = args #将参数解包 ...

  2. 用 Python 制作一个艺术签名小工具,给自己设计一个优雅的签名

    生活中有很多场景都需要我们签字(签名),如果是一些不重要的场景,我们的签名好坏基本无所谓了,但如果是一些比较重要的场景,如果我们的签名比较差的话,就有可能给别人留下不太好的印象了,俗话说字如其人嘛,本 ...

  3. linux系统中SSH免密设置报错

    执行 ssh-add ~/.ssh/msi_rsa 时报下面错误 Could not open a connection to your authentication agent. 解决办法: 执行命 ...

  4. SpringBoot2 整合Ehcache组件,轻量级缓存管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.Ehcache缓存简介 1.基础简介 EhCache是一个纯Java的进程内缓存框架,具有快速.上手简单等特点,是Hibernate中默认 ...

  5. 2020-03-26:eureka 和其他注册中心比如zk有什么不同?

    从eureka工作原理可以看出,eureka client有缓存功能,即使eureka所有的serve都宕掉,仍然能给服务消费者发送服务信息,所以eureka保证了服务可用性,不能保证数据一致性,是一 ...

  6. C#LeetCode刷题之#62-不同路径(Unique Paths)

    目录 问题 示例 分析 问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3680 访问. 一个机器人位于一个 m x ...

  7. Flutter 容器 (2) - Padding

    Padding: 内边距Widget,与CSS中的padding相似. import 'package:flutter/material.dart'; class AuthList extends S ...

  8. TCP/IP速记

    目录 网络协议 OSI七层模型和TCP/IP五层模型 TCP/IP五层模型 TCP的三次握手和四次挥手 三次握手进行连接 四次挥手断开连接 TCP连接的特点 TCP是如何保证安全可靠的 UDP连接的特 ...

  9. 面试中的老大难-mysql事务和锁,一次性讲清楚!

    众所周知,事务和锁是mysql中非常重要功能,同时也是面试的重点和难点.本文会详细介绍事务和锁的相关概念及其实现原理,相信大家看完之后,一定会对事务和锁有更加深入的理解. 本文主要内容是根据掘金小册& ...

  10. [Hadoop] mapper数量的控制

    确定map任务数时依次优先参考如下几个原则: 1)      每个map任务使用的内存不超过800M,尽量在500M以下 比如处理256MB数据需要的时间为10分钟,内存为800MB,此时如果处理12 ...