Android_程序未处理异常的捕获与处理

Posted jhcelue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android_程序未处理异常的捕获与处理相关的知识,希望对你有一定的参考价值。

1.简单介绍

对于程序抛出的未被捕获的异常,可能会导致程序异常退出,界面不友好且应记录关键错误信息上传至server。

这里主要使用UncaughtExceptionHandler

2.代码实现

public class CrashHandler implements UncaughtExceptionHandler {
	public static final String TAG = CopyOfCrashHandler.class.getSimpleName();

	// 系统默认的UncaughtException处理类
	private Thread.UncaughtExceptionHandler mDefaultHandler;
	private static CopyOfCrashHandler instance;
	private Context mContext;

	private CopyOfCrashHandler() {
	}

	/** 获取CrashHandler实例 ,单例模式 */
	public static CopyOfCrashHandler getInstance() {
		if (instance == null)
			instance = new CopyOfCrashHandler();
		return instance;
	}

	/**
	 * 初始化
	 */
	public void init(Context context) {
		mContext = context;
		//记录下默认的UncaughtExceptionHandler
		mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
		//
		Thread.setDefaultUncaughtExceptionHandler(this);
	}

	/**
	 * 当UncaughtException发生时会转入该函数来处理
	 */
	@Override
	public void uncaughtException(Thread thread, Throwable ex) {
		if (!handleException(thread, ex) && mDefaultHandler != null) {
			// 假设用户没有处理则让系统默认的异常处理器来处理
			mDefaultHandler.uncaughtException(thread, ex);
		} else {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			android.os.Process.killProcess(android.os.Process.myPid());
			System.exit(1);
		}
	}

	/**
	 * 自己定义错误处理,收集错误信息 发送错误报告等操作均在此完毕.
	 * 
	 * @param ex
	 * @return true:假设处理了该异常信息;否则返回false.
	 */
	private boolean handleException(Thread thread, Throwable ex) {
		if (ex == null) {
			return false;
		}

		StringBuffer sb = new StringBuffer();
		sb.append(thread + ", Cause By:" + ex).append("\r\n\r\n");

		StackTraceElement[] elements = ex.getStackTrace();
		for (int i = 0; i < elements.length; i++) {
			sb.append(elements[i].toString() + "\r\n");
		}
		//记录下关键错误信息,能够存至本地并上传至server
		//LogUtil.bug(TAG, sb.toString());
		
		//打开新Activity友好界面提示
		//Util.showDialog(mContext, "时间:"+Util.formatSimpleDateAndTime(new Date()), "程序出现异常,请记录时间并提示开发者!");
		return true;
	}
}

以上是关于Android_程序未处理异常的捕获与处理的主要内容,如果未能解决你的问题,请参考以下文章

异常和TCP通讯

Android视图:未捕获的处理程序:线程主因未捕获的异常而退出

自己定义Application的未捕获异常处理

WPF捕获全局未处理异常

编写高质量代码改善C#程序的157个建议——建议65:总是处理未捕获的异常

Android中使用UncaughtExceptionHandler来处理未捕获的异常