程序的崩溃处理UncaughtExceptionHandler
2016-09-20 09:15
393 查看
引言
一般程序崩溃时会退出,同时在控制台输出崩溃时的堆栈信息,如下代码:
扩展应用
很多时候,我们希望对崩溃进行一些处理,比如将崩溃堆栈保存到文件,或是发送到服务器进行统一分析,例子如下:
分析
源代码中Thread.java的UncaughtExceptionHandler接口注释说明如下:程序崩溃流程如下:
系统分发崩溃消息
ThreadGroup没有处理就交给Thread的defaultUncaughtExceptionHandler处理。
如果没有defaultUncaughtExceptionHandler,就直接输出异常的名字和打印堆栈信息,也就是一般我们看到的出错信息(一般uncaughtExceptionHandler和defaultUncaughtExceptionHandler没有显式地赋值)。Android中ThreadGroup的uncaughtException方法稍有不同,如下:
扩展
统计的代码里使用的是Thread.setDefaultUncaughtExceptionHandler,在崩溃时,将堆栈信息写入数据库,下次启动时发送到服务器。其中
要点
异常会改变了程序的走向,一般性的异常需要使用try catch进行处理,由用户控制程序流程;运行时异常(空指针、除0等)不需要try catch处理,它由虚拟机来控制改变程序流程,一般是调用Thread的uncaughtExceptionHandler或是defaultUncaughtExceptionHandler来处理。uncaughtExceptionHandler或是defaultUncaughtExceptionHandler异常处理的代码其实也是由发触发异常的线程执行的,执行完毕,线程也就结束了。
异常的处理顺序为 uncaughtExceptionHandler -> defaultUncaughtExceptionHandler -> 输出堆栈信息(Android的输出内容前面少了Exception in thread "main"之类的东西)。
在uncaughtException方法中,如果再出现空指针之类的异常,线程就此停止,后续的代码将不再执行。
uncaughtExceptionHandler是对当前线程而言,defaultUncaughtExceptionHandler是对所有线程而言的,一般程序可能会有多个线程,因此一般的做法是使用defaultUncaughtExceptionHandler。
注意
不管CPU是单核还是多核,操作系统之上是透明的,多任务并发其实是分配时间片。并发会造成系统整体性能下降,因为并发控制本身是要耗费资源的。
一个程序内启用多个线程其实是增加本程序在系统中的比重,让系统分配更多的时间片来执行本程序的代码。
多线程的同步问题处理不好会造成逻辑混乱,管理线程需要额外的开销,因此使用多线程要慎重,多方面权衡。
相关文章推荐
- android 程序错误处理全局处理 UncaughtExceptionHandler
- android应用开发-------------应用崩溃全局异常捕获处理(UncaughtExceptionHandler)
- android 处理程序全局异常和错误,UncaughtExceptionHandler
- Android开发如何使用UncaughtExceptionHandler捕获程序崩溃错误信息?
- android 程序错误处理全局处理 UncaughtExceptionHandler
- iOS-中捕获程序崩溃日志-NSSetUncaughtExceptionHandler
- 利用Android的UncaughtExceptionHandler捕获崩溃异常
- java UncaughtExceptionHandler 处理线程意外中止
- IOS崩溃 异常处理(NSSetUncaughtExceptionHandler)
- 异常处理程序(Exception handler)
- android 通过UncaughtExceptionHandler处理和上传错误日志
- iOS —— 发布应用的异常信息捕获和处理 NSSetUncaughtExceptionHandler()
- JDK5_Thread的run异常的setUncaughtExceptionHandler处理
- java UncaughtExceptionHandler 处理线程意外中止
- NSSetUncaughtExceptionHandler捕获程序异常
- 异常捕获拒绝闪退 让应用从容的崩溃UncaughtExceptionHandler
- Android捕获异常处理——UncaughtExceptionHandler
- Java异常处理之处理未捕获的异常及UncaughtExceptionHandler的使用
- 全局异常处理UncaughtExceptionHandler
- java多线程中unchecked 异常的处理UncaughtExceptionHandler