1. 程式人生 > >捕捉全域性異常簡單篇

捕捉全域性異常簡單篇

遇到軟體沒有捕獲的異常之後,系統會彈出這個預設的強制關閉對話方塊。
我們當然不希望使用者看到這種現象,簡直是對使用者心靈上的打擊,而且對我們的bug的修復也是毫無幫助的。我們需要的是軟體有一個全域性的異常捕獲器,當出現一個我們沒有發現的異常時,捕獲這個異常,並且將異常資訊記錄下來,上傳到伺服器公開發這分析出現異常的具體原因

 /** 
 * UncaughtException處理類,當程式發生Uncaught異常的時候,有該類來接管程式,並記錄傳送錯誤報告. 
 */ 
public class Mapp extends Application{
    private static Context mContext;
    @Override
public void onCreate() { super.onCreate(); this.mContext = this; CrashHandler.getInstance().init(this);//初始化全域性異常管理 } public static Context getContext(){ return mContext; } }

CrashHandler 實現類如下

import android.content.Context;
import android.os.Environment;
import
android.util.Log; import java.io.File; import java.io.FileOutputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map; /** * 1. 類的用途 * 2. @author BeaHug * 3. @date 2017/9/20 16:53 */ public class CrashHandler implements
Thread.UncaughtExceptionHandler {
private Context mContext; /** * 系統預設UncaughtExceptionHandler */ private Thread.UncaughtExceptionHandler mDefaultHandler; /** * 儲存異常和引數資訊 */ private Map<String, String> paramsMap = new HashMap<>(); private static CrashHandler mInstance; /** * 獲取CrashHandler例項 */ public static synchronized CrashHandler getInstance() { if (null == mInstance) { mInstance = new CrashHandler(); } return mInstance; } public void init(Context context) { mContext = context; mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); //設定該CrashHandler為系統預設的 Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread thread, Throwable throwable) { handleException(throwable); } private boolean handleException(Throwable ex) { if (ex == null) { return false; } saveCrashInfo2File(ex); return true; } private String saveCrashInfo2File(Throwable ex) { StringBuffer sb = new StringBuffer(); for (Map.Entry<String, String> entry : paramsMap.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); sb.append(key + "=" + value + "\n"); } Writer writer = new StringWriter(); PrintWriter printWriter = new PrintWriter(writer); ex.printStackTrace(printWriter); Throwable cause = ex.getCause(); while (cause != null) { cause.printStackTrace(printWriter); cause = cause.getCause(); } printWriter.close(); String result = writer.toString(); sb.append(result); try { String timestamp = "catcherror"; // String time = format.format(new Date()); String fileName = timestamp + ".log"; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { String path = Environment.getExternalStorageDirectory() + "/sdcard/"; File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } FileOutputStream fos = new FileOutputStream(path + fileName); fos.write(sb.toString().getBytes()); fos.close(); } return fileName; } catch (Exception e) { Log.e("", "an error occured while writing file...", e); } return null; } }

只能將異常存到SD中,不能上傳伺服器
請點評…