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. 详细记录了python爬取小说《元尊》的整个过程,看了你必会~

    学了好几天的渗透测试基础理论,周末了让自己放松一下,最近听说天蚕土豆有一本新小说,叫做<元尊>,学生时代的我可是十分喜欢读天蚕土豆的小说,<斗破苍穹>相信很多小伙伴都看过吧.今 ...

  2. Centos8最小化部署安装OpenStack Ussuri

    #!/bin/bash #Centos8最小化部署安装OpenStack Ussuri #共两台主机,分别是一台控制节点,一台计算节点 #.控制节点内存4096M.双网卡,分别为eth0:10.0.0 ...

  3. 分类模型的F1-score、Precision和Recall 计算过程

    分类模型的F1分值.Precision和Recall 计算过程 引入 通常,我们在评价classifier的性能时使用的是accuracy 考虑在多类分类的背景下 accuracy = (分类正确的样 ...

  4. Android 进度条(ProgressBar)和拖动条(Seekbar)补充“自定义组件”(总结)

    这周结束了,我也码了一周的字,感觉还是很有种脚踏实地的感觉的,有时间就可以看看自己的总结再查漏补缺,一步一个脚印,做出自己最理想的项目. 今天我们讲两点: 1.ProgressBar: 其实前面也稍微 ...

  5. python8.3多进程

    from multiprocessing import Processimport time def run1 (name,sex): print(name,sex,"执行进程1" ...

  6. (转)Qt添加windows开机自启动

    原博文地址为:https://blog.csdn.net/x356982611/article/details/53183144 简介 window下开机启动最简单的实现方式就是在注册表中添加启动项目 ...

  7. 极简 Node.js 入门 - 1.2 模块系统

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  8. Android Studio--APK打包

    首先在app的build.gradle里面加一下代码 lintOptions { checkReleaseBuilds false abortOnError false } 在上方Build里面找到G ...

  9. 2020-04-06:为什么HashMap不一直使用红黑树?

    红黑树的阈值是8,当链表大于等于8时链表变成了红黑树结构,大大减少了查找的时间. 当长度低于6时会由红黑树转成链表,TreeNodes占用空间是普通Nodes的两倍,所以只有当bin包含足够多的节点时 ...

  10. C#LeetCode刷题之#500-键盘行(Keyboard Row)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3796 访问. 给定一个单词列表,只返回可以使用在键盘同一行的字母 ...