异常捕捉:UncaughtExceptionHandler
1、UncaughtExceptionHandler
UncaughtExceptionHandler是定义在Thread类中的接口,用于处理导致线程终止的未捕获异常。
/**
* 当线程由于未捕获的异常突然终止时调用的处理程序的接口。 当线程由于未捕获的异常而将终止时,
* Java虚拟机将使用getUncaughtExceptionHandler查询线程的UncaughtExceptionHandler并将调用处理程序的uncaughtException方法,
* 并将线程和异常作为参数传递.
* 如果未显式设置线程的UncaughtExceptionHandler,则其ThreadGroup对象将充当其UncaughtExceptionHandler.
* 如果ThreadGroup对象对处理异常没有特殊要求,则可以将调用转发到getDefaultUncaughtExceptionHandler默认未捕获的异常处理程序.
*
* @see #setDefaultUncaughtExceptionHandler
* @see #setUncaughtExceptionHandler
* @see ThreadGroup#uncaughtException
* @since 1.5
*/
@FunctionalInterface
public interface UncaughtExceptionHandler {
/**
* Method invoked when the given thread terminates due to the
* given uncaught exception.
* <p>Any exception thrown by this method will be ignored by the
* Java Virtual Machine.
* @param t the thread
* @param e the exception
*/
void uncaughtException(Thread t, Throwable e);
}2、自定义UncaughtExceptionHandler
只需要实现Thread.UncaughtExceptionHandler接口,实现uncaughtException(Thread t, Throwable e)方法,应用遇到异常奔溃的时候,就会调用uncaughtException(Thread t, Throwable e)方法。这里有通用的模板,用Kotlin的object关键字可以很方便的实现一个单例:
object CrashHandler : Thread.UncaughtExceptionHandler {
override fun uncaughtException(t: Thread, e: Throwable) {
TODO("1.Report crash 2.Restart App 3.Save logs 4.Kill process")
}
/**
* set UncaughtExceptionHandler setUncaughtExceptionHandler(UncaughtExceptionHandler eh)
*
* @param thread Thread
*/
fun setCrashHandler(thread: Thread) {
thread.uncaughtExceptionHandler = this
}
public fun init() {
Thread.setDefaultUncaughtExceptionHandler(this)
}
}可以在uncaughtException(Thread t, Throwable e)方法中处理异常,比如上报/保存异常信息,重启应用(要避免循环奔溃)等操作。
3、使用UncaughtExceptionHandler
在自定义的Application中,设置自定义的UncaughtExceptionHandler:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
//给当前应用主线程设置UncaughtExceptionHandler
Thread.currentThread().uncaughtExceptionHandler = CrashHandler
//或者给Thread全局设置一个默认的UncaughtExceptionHandler,替换Android框架设置的KillApplicationHandler
//不管是主线程还是子线程,所有线程奔溃都是使用此UncaughtExceptionHandler
Thread.setDefaultUncaughtExceptionHandler(CrashHandler)
//或者用init()方法初始化
CrashHandler.init()
}
}①catch的异常捕获不到
②只能处理未捕获的异常
参考博客:
Android利用Thread.UncaughtExceptionHandler收集异常信息
UncaughtExceptionHandler异常捕获及最佳实践

