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     }
相關文章
相關標籤/搜索