在做項目時,經(jīng)常會把錯誤利用異常拋出去,這樣在開發(fā)時就可以通過手機(jī)拋出的異常排查錯誤。但是當(dāng)程序開發(fā)完畢,版本穩(wěn)定,需要上線時,為了避免拋出異常影響用戶感受,可以用UncaughtExceptionHandler捕獲全局異常,對異常做出處理。比如我們可以獲取到拋出異常的時間、手機(jī)的硬件信息、錯誤的堆棧信息,然后將獲取到的所有的信息發(fā)送到服務(wù)器中,也可以發(fā)送到指定的郵件中,以便及時修改bug。
示例:
自定義異常類實現(xiàn)UncaughtExceptionHandler接口,當(dāng)某個頁面出現(xiàn)異常就會調(diào)用uncaughtException這個方法,我們可以在這個方法中獲取異常信息、時間等,然后將獲取到的信息發(fā)送到我們指定的服務(wù)器
public void uncaughtException(Thread arg0, Throwable arg1) {
System.out.println("程序掛掉了 ");
// 1.獲取當(dāng)前程序的版本號. 版本的id
String versioninfo = getVersionInfo();
// 2.獲取手機(jī)的硬件信息.
String mobileInfo = getMobileInfo();
// 3.把錯誤的堆棧信息 獲取出來
String errorinfo = getErrorInfo(arg1);
// 4.把所有的信息 還有信息對應(yīng)的時間 提交到服務(wù)器
try {
service.createNote(new PlainTextConstruct(dataFormat.format(new Date())),
new PlainTextConstruct(versioninfo+mobileInfo+errorinfo), "public", "yes");
} catch (Exception e) {
e.printStackTrace();
}
//干掉當(dāng)前的程序
android.os.Process.killProcess(android.os.Process.myPid());
}
/**
* 獲取錯誤的信息
* @param arg1
* @return
*/
private String getErrorInfo(Throwable arg1) {
Writer writer = new StringWriter();
PrintWriter pw = new PrintWriter(writer);
arg1.printStackTrace(pw);
pw.close();
String error= writer.toString();
return error;
}
/**
* 獲取手機(jī)的硬件信息
* @return
*/
private String getMobileInfo() {
StringBuffer sb = new StringBuffer();
//通過反射獲取系統(tǒng)的硬件信息
try {
Field[] fields = Build.class.getDeclaredFields();
for(Field field: fields){
//暴力反射 ,獲取私有的信息
field.setAccessible(true);
String name = field.getName();
String value = field.get(null).toString();
sb.append(name+"="+value);
sb.append("/n");
}
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* 獲取手機(jī)的版本信息
* @return
*/
private String getVersionInfo(){
try {
PackageManager pm = context.getPackageManager();
PackageInfo info =pm.getPackageInfo(context.getPackageName(), 0);
return info.versionName;
} catch (Exception e) {
e.printStackTrace();
return "版本號未知";
}
}
}
新聞熱點
疑難解答
圖片精選