android 捕获未try的异常、抓取崩溃日志
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的异常、抓取崩溃日志的更多相关文章
- Android--iOS抓取崩溃日志
android闪退获取日志方法: 1.下载adb工具包 2.注意事项 请确保电脑上只连接了一台手机设备(最好只连接一条USB线),同时确保手机已开启USB调试模式(可通过手机助手查看连接状态) 3.A ...
- android 捕获未try的异常
1.Thread.UncaughtExceptionHandler java里有很多异常如:空指针异常,越界异常,数值转换异常,除0异常,数据库异常等等.如果自己没有try / catch 那么线程就 ...
- 如何抓取崩溃的log日志
4.手机录屏工具的推荐 Andriod:录屏大师,易录屏等等. iOS:AirPlayer,iTools. 5.如何抓取崩溃的log日志? android闪退获取日志方法: 1.下载adb工具包 2. ...
- 【应用服务 App Service】App Service中抓取网络日志
问题描述 众所周知,Azure App Service是一种PaaS服务,也就是说,IaaS层面的所有内容都由平台维护,所以使用App Service的我们根本无法触碰到远行程序的虚拟机(VM), 所 ...
- 【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
问题描述 在App Service For Windows的环境中,我们可以通过ArmClient 工具发送POST请求在Web应用的实例中抓取网络日志,但是在App Service For Linu ...
- android开发之应用Crash自动抓取Log_自动保存崩溃日志到本地
http://blog.csdn.net/jason0539/article/details/45602655 应用发生crash之后要查看log,判断问题出在什么地方,可是一旦应用发布出去,就要想办 ...
- WPF捕获未处理的异常
WPF程序中,对于异常的捕获一般使用try/catch块.就像程序中的bug一样,很难保证程序中所有的异常都能够通过try/catch捕获.如果异常没有被捕获,轻则影响用户体验,严重时会导致数据丢失 ...
- C# WinForm捕获未处理的异常
using System; using System.Collections.Generic; using System.Windows.Forms; using System.IO; namespa ...
- android抓取logcat日志的方法
这几天帮忙测试一个APP,报告结果需要提交日志文件,于是百度了下安卓的获取日志方法,其实很简单,7个步骤搞定,下面把我的总结分享给大家. 1.下载adb工具包 https://pan.baidu.co ...
随机推荐
- UML科普文,一篇文章掌握14种UML图
前言 上一篇文章写了一篇建造者模式,其中有几个UML类图,有的读者反馈看不懂了,我们今天就来解决一哈. 什么是UML? UML是Unified Model Language的缩写,中文是统一建模语言, ...
- alpine 容器优化
摘要:alpine容器一直是使用得比较多的,而且也是官方推荐使用的.但是官方的容器会有一些不方便的地方,比如安装软件, 时区不同等. 所以本文旨在完成一个alpine容器通用模板作为记录 # 导入 ...
- 4、Java基本数据类型
一.基本数据类型 1.基本数据类型 JAVA中一共有八种基本数据类型,他们分别是 byte.short.int.long.float.double.char.boolean 类型 型别 字节 取值范围 ...
- python流程控制-if
在python中流程控制可以分为三种,分别是顺序结构.分支结构和循环结构.分支结构:if..else循环结构:while循环.for循环 一:分支结构 1:单项分支 语法: 含义:判断条件,条件结果为 ...
- HTML基础-03
盒子模型 盒子模型(框模型 box model) - 浏览器在渲染页面时,它会将页面中的每一个元素都想象成是一个矩形的盒子. - 想象成盒子以后,对于页面的布局就变成了如何摆放盒子 - 每一个盒子从内 ...
- drop、truncate、delete功能介绍和三者间区别
一.delete 1.delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表 ...
- Mybatis-08-动态SQL
动态SQL 什么是动态SQL? 根据不同的条件生成不同的SQL语句. if choose(where,otherwise) trim(where,set) foreach 搭建环境 create ta ...
- ajax、反向ajax、jsonp详解
ajax详解 什么是ajax 其实ajax已经属于老技术了,现在几乎没人不会用了,在这里主要是把底层的东西给大家分享一下,以备应对装逼的面试官. ajax即“Asynchronous Javascri ...
- 【API进阶之路】逆袭!用关键词抽取API搞定用户需求洞察
摘要: 老大说,我这份用关键词抽取API搞定的用户需求洞察报告,简直比比市场调研的科班人士做得还好. 最近这半个月的午饭,那可是相当不错,市场老大天天请吃饭,不是外面下馆子,就是从家带饺子.说是感谢我 ...
- autotools使用
autotools制作makefile 下面以hello.c来说明生成makefile的过程. 基本步骤如下: 1)autoscan命令生成configure.scan文件,重命名configure. ...