读书人

Android 错误捕获

发布时间: 2013-01-25 15:55:29 作者: rapoo

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;

?

?

?

读书人网 >Android

热点推荐