Android 异常捕获
在Android应用开发中,有时需要由应用程序本省获得异常报告并提交给开发者,这样就需要获得App崩溃的信息。利用Java中的UncaughtExceptionHandler可以很方便的实现这个操作。默认情况下,线程执行中发生了未捕获的异常,会由默认的DefaultUncaughtExceptionHandler来处理。为了介入到这个操作中并添加自定义的逻辑,需要继承UncaughtExceptionHandler,然后添加自己的逻辑代码。
?
代码示例:
?
import java.lang.Thread.UncaughtExceptionHandler;import android.content.Context;public class CrashHandler implements UncaughtExceptionHandler { private static CrashHandler instance; private Context mContext; private Thread.UncaughtExceptionHandler mDefaultHandler; private CrashHandler() { } public static CrashHandler getInstance() { if (instance == null) { instance = new CrashHandler();} return instance; } public void init(Context context) { mContext = context; mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread thread, Throwable ex) { }}?
?
说明:
自定义的处理操作需要添加到public void uncaughtException(Thread thread, Throwable ex)方法中;从ex中可获得追踪的堆栈信息,下面示例是把相关信息保存到文件:?
private void save2File (Throwable ex) throws Exception {StackTraceElement[] stacks = ex.getStackTrace();File file = BUG_REPORT_FILE; PrintWriter pw = null; pw = new PrintWriter(new FileOutputStream(file)); StringBuilder sb = new StringBuilder(); int len = stacks.length; for (int i = 0; i < len; i++) { StackTraceElement stack = stacks[i]; sb.setLength(0); sb.append(stack.getClassName()).append("#"); sb.append(stack.getMethodName()).append(":"); sb.append(stack.getLineNumber()); pw.println(sb.toString()); } pw.close();}?
在uncaughtException中处理未捕获异常时,可以根据自定义操作的完成情况,来选择是否执行默认的mDefaultHandler的uncaughtException操作;在Activity中的调用方法:
CrashHandler.getInstance().init(this);
?
至于如何测试,可以throw一个异常:
throw new InvalidParameterException();
?或者写一行产生异常的代码:
int a = 0, b = 0; a = a / b;
?
?
?