捕捉全域性異常簡單篇
阿新 • • 發佈:2019-02-14
遇到軟體沒有捕獲的異常之後,系統會彈出這個預設的強制關閉對話方塊。
我們當然不希望使用者看到這種現象,簡直是對使用者心靈上的打擊,而且對我們的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中,不能上傳伺服器
請點評…