捕獲Android 錯誤信息然后發送至服務器

m8x2 9年前發布 | 2K 次閱讀 Java Android

原理: 跟JavaEE的自定義異常捕獲一樣,將錯誤一直向上拋,然后在最上層統一處理。這里就可以獲得異常信息,先保存到本地,下一次運行的時候上傳到服務區. 當然這些可以由程序員自己根據實際情況具體處理,這里只是提供捕獲異常并進一步處理的一個方案. 主要用到的是自定義的CrashHandler(繼承自UncaughtExceptionHandler),具體代碼如下:

    /**

* @author Tian 
* 在Application中統一捕獲異常,保存到文件中下次再打開時上傳  
*/   

public class CrashHandler implements UncaughtExceptionHandler {   


/** 是否開啟日志輸出,在Debug狀態下開啟,  
* 在Release狀態下關閉以提示程序性能  
* */   

public static final boolean DEBUG = true;   


/** 系統默認的UncaughtException處理類 */   

private Thread.UncaughtExceptionHandler mDefaultHandler;   

/** CrashHandler實例 */   

private static CrashHandler INSTANCE;   


/** 程序的Context對象 */   

// private Context mContext;   

/** 保證只有一個CrashHandler實例 */   

private CrashHandler() {}   

/** 獲取CrashHandler實例 ,單例模式*/   

public static CrashHandler getInstance() {   

if (INSTANCE == null) {   
INSTANCE = new CrashHandler();   
}   
return INSTANCE;   
}   

/**  
* 初始化,注冊Context對象,  
* 獲取系統默認的UncaughtException處理器,  
* 設置該CrashHandler為程序的默認處理器  
*  
* @param ctx  
*/   

public void init(Context ctx) {   
// mContext = ctx;   
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();   
Thread.setDefaultUncaughtExceptionHandler(this);   
}   

/**  
* 當UncaughtException發生時會轉入該函數來處理  
*/   

@Override   
public void uncaughtException(Thread thread, Throwable ex) {   
if (!handleException(ex) && mDefaultHandler != null) {   
//如果用戶沒有處理則讓系統默認的異常處理器來處理   
mDefaultHandler.uncaughtException(thread, ex);   
} else { //如果自己處理了異常,則不會彈出錯誤對話框,則需要手動退出app   
try {   
Thread.sleep(3000);   
} catch (InterruptedException e) {   
}   
android.os.Process.killProcess(android.os.Process.myPid());   
System.exit(10);   
}   

}   

/**  
* 自定義錯誤處理,收集錯誤信息  
* 發送錯誤報告等操作均在此完成.  
* 開發者可以根據自己的情況來自定義異常處理邏輯  
* @return  
* true代表處理該異常,不再向上拋異常,  
* false代表不處理該異常(可以將該log信息存儲起來)然后交給上層(這里就到了系統的異常處理)去處理,  
* 簡單來說就是true不會彈出那個錯誤提示框,false就會彈出  
*/   

private boolean handleException(final Throwable ex) {   
if (ex == null) {   
return false;   
}   

// final String msg = ex.getLocalizedMessage();   
final StackTraceElement[] stack = ex.getStackTrace();   
final String message = ex.getMessage();   

//使用Toast來顯示異常信息   
new Thread() {   
@Override   
public void run() {   

Looper.prepare();   
// Toast.makeText(mContext, "程序出錯啦:" + message, Toast.LENGTH_LONG).show();   
// 可以只創建一個文件,以后全部往里面append然后發送,這樣就會有重復的信息,個人不推薦   

String fileName = "crash-" + System.currentTimeMillis() + ".log";   
File file = new File(Environment.getExternalStorageDirectory(), fileName);   
try {   
FileOutputStream fos = new FileOutputStream(file,true);   
fos.write(message.getBytes());   
for (int i = 0; i < stack.length; i++) {   
fos.write(stack[i].toString().getBytes());   
}   

fos.flush();   
fos.close();   
} catch (Exception e) {   
}   
Looper.loop();   
}   

}.start();   
return false;   
}   

// TODO 使用HTTP Post 發送錯誤報告到服務器 這里不再做詳細描述  
// private void postReport(File file) {   

// }   

}   </pre> 


 本文由用戶 m8x2 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!