捕获全局异常

UncaughtExceptionHandler

Java提供了一种捕获全局异常的机制,当线程中出现异常时,我们可以主动将其捕获,并传入自己的异常
处理其,可以决定是否结束程序;

捕获处理某个线程的异常:

1
2
3
4
5
6
// 此处代码为RxJava2不处理onError时,将异常交给当前线程默认的异常处理器处理
static void uncaught(@NonNull Throwable error) {
Thread currentThread = Thread.currentThread();
UncaughtExceptionHandler handler = currentThread.getUncaughtExceptionHandler();
handler.uncaughtException(currentThread, error);
}

设置自己的线程异常处理器:

1
thread.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());

将所有线程异常统一处理:

1
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());

自定义UncaughtExceptionHandler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class CrashHandler implements Thread.UncaughtExceptionHandler {
private static final String TAG = "CrashHandler";
private Context mContext;
volatile private static CrashHandler sCrashHandler;

private CrashHandler(Context context) {
mContext = context;
}

public static CrashHandler getInstance(Context context){
if (sCrashHandler == null) {
synchronized (CrashHandler.class){
if (sCrashHandler == null) {
//使用Application Context
sCrashHandler=new CrashHandler(context.getApplicationContext());
}
}
}
return sCrashHandler;
}


@Override
public void uncaughtException(Thread t, Throwable e) {
if (BuildConfig.DEBUG) Log.d(TAG, "uncaughtException: "+t.getName()+" "+e.getMessage());
//这里可以将异常信息保存或上传
//...

//可根据情况选择是否干掉当前的进程
android.os.Process.killProcess(android.os.Process.myPid());
}
}

注册:

1
2
3
4
5
6
7
public class CrashApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler(CrashHandler.getInstance(this));
}
}

在Android中,可以通过UncaughtExceptionHandler实现在抛出异常时,跳转到指定页面,可以参考项目:https://github.com/Ereza/CustomActivityOnCrash

参考:https://www.jianshu.com/p/84eba8efa45e