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); 
扫描二维码关注公众号,回复: 724487 查看本文章

至于如何测试,可以throw一个异常:

        throw new InvalidParameterException();

 或者写一行产生异常的代码:

        int a = 0, b = 0;
        a = a / b;

猜你喜欢

转载自wangleyiang.iteye.com/blog/1773151