android 捕获未try的异常

1.Thread.UncaughtExceptionHandler

  java里有不少异常如:空指针异常,越界异常,数值转换异常,除0异常,数据库异常等等。若是本身没有try / catch 那么线程就崩溃。java

  并不能对全部代码都try/catch,若是代码产生了未捕获的异常,又不想让程序崩溃,或者在崩溃以前要作一些收尾工做。怎么办?android

  Thread.UncaughtExceptionHandler 类能够解决这个问题,当有未捕获异常时,它的 public void uncaughtException(Thread t, Throwable e) 方法会被调用,参数包含了崩溃的线程及相应的异常信息。数据库

  Thread类中的 public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh) 方法指定接收未捕获异常处理类。一般在 Application 里指定一个生命周期很长的未捕获异常处理类。app

2.示例

2.1 自定义Thread.UncaughtExceptionHandler

 1 package com.example.uncrash;
 2 
 3 import android.util.Log;
 4 
 5 public class CrashHandler implements Thread.UncaughtExceptionHandler {
 6     final String TAG = "CrashHandler";
 7 
 8     @Override
 9     public void uncaughtException(Thread t, Throwable e) {
10         e.printStackTrace();
11         Log.e(TAG, "uncaughtException: " + e.getMessage() + " thread = " + t.getId());
12         if (t.getId() == 1){
13             //...
14         }
15         //异常信息收集
16 
17         //应用程序信息收集
18 
19         //保存错误报告文件到文件。
20     }
21 }

2.2 在application里注册

 1 public class UnCrashApplication extends Application {
 2 
 3     CrashHandler    handler;
 4 
 5     @Override
 6     public void onCreate() {
 7         super.onCreate();
 8 
 9         handler = new CrashHandler();
10 
11         Thread.setDefaultUncaughtExceptionHandler(handler);
12 
13     }
14 }

2.3 在自定义的线程中注册

 1  private void init(){
 2 
 3         new Thread(){
 4             @Override
 5             public void run() {
 6                 setUncaughtExceptionHandler(crashHandler);
 7                 int num = 100 / 0;
 8             }
 9         }.start();
10     }
11     public CrashHandler crashHandler = new CrashHandler();
12     public class CrashHandler implements Thread.UncaughtExceptionHandler {
13         final String TAG = "CrashHandler";
14 
15         @Override
16         public void uncaughtException(Thread t, Throwable e) {
17             e.printStackTrace();
18             Log.e(TAG, "uncaughtException: " + e.getMessage() + " thread = " + t.getId());
19             if (t.getId() == 1){
20                 //...
21             }
22             //异常信息收集
23             //应用程序信息收集
24             //保存错误报告文件到文件。
25         }
26     }