关于UncaughtExceptionHandler捕获程序奔溃异常的求助

qq_35313269 2016-06-14 06:45:57
楼主想使用UncaughtExceptionHandler将奔溃原因记录到本地。成功地触发uncaughtException()回调.
但是问题在于uncaughtException()方法的内容经常执行不完就彻底挂了,例如我在uncaughtException()里采集手机信息,然后保存到txt文件。结果经常是信息采集完,还没保存到txt,代码就不往下执行了。有的时候,uncaughtException()方法就执行了第一句打印Log.i(),然后就不往下执行。少数时候,能够成功保存到txt。

代码如下:
@Override
public void uncaughtException(Thread thread, Throwable ex) {
Log.i("one", "进了");
if (!handleException(ex) && mDefaultHandler != null) {
//如果用户没有处理则让系统默认的异常处理器来处理
mDefaultHandler.uncaughtException(thread, ex);
} else {
//Sleep一会后结束程序
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Log.e(TAG, "Error : ", e);
}
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(10);
}
}

private boolean handleException(Throwable ex) {
if (ex == null) {
Log.w(TAG, "handleException --- ex==null");
return true;
}
final String msg = ex.getLocalizedMessage();
if(msg == null) {
return false;
}
//使用Toast来显示异常信息
new Thread() {
@Override
public void run() {
Looper.prepare();
Toast toast = Toast.makeText(mContext, "程序出错,即将退出:\r\n" + msg,
Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
// MsgPrompt.showMsg(mContext, "程序出错啦", msg+"\n点确认退出");
Looper.loop();
}
}.start();
//收集设备信息
collectCrashDeviceInfo(mContext);
//保存错误报告文件
saveCrashInfoToFile(ex);
//发送错误报告到服务器
//sendCrashReportsToServer(mContext);
return true;
}

/**
* 保存错误信息到文件中
* @param ex
* @return
*/
private String saveCrashInfoToFile(Throwable ex) {
Writer info = new StringWriter();
PrintWriter printWriter = new PrintWriter(info);
ex.printStackTrace(printWriter);
Throwable cause = ex.getCause();
while (cause != null) {
cause.printStackTrace(printWriter);
cause = cause.getCause();
}
String result = info.toString();
printWriter.close();
mDeviceCrashInfo.put("EXEPTION", ex.getLocalizedMessage());
mDeviceCrashInfo.put(STACK_TRACE, result);
try {
//long timestamp = System.currentTimeMillis();
Time t = new Time("GMT+8");
t.setToNow(); // 取得系统时间
int date = t.year * 10000 + t.month * 100 + t.monthDay;
int time = t.hour * 10000 + t.minute * 100 + t.second;
String fileName = "crash-" + date + "-" + time + CRASH_REPORTER_EXTENSION;
LogUtils.log2File2(fileName, "e", "厂商:"+mDeviceCrashInfo.get(PHONE_BRAND)
+"\t手机型号:"+mDeviceCrashInfo.get(PHONE_MODE)
+"\tEXEPTION:"+mDeviceCrashInfo.get("EXEPTION")
+"\t异常信息:"+mDeviceCrashInfo.get(STACK_TRACE));
// FileOutputStream trace = mContext.openFileOutput(fileName,
// Context.MODE_PRIVATE);
// mDeviceCrashInfo.store(trace, "");
// trace.flush();
// trace.close();
return fileName;
} catch (Exception e) {
Log.e(TAG, "an error occured while writing report file...", e);
}
return null;
}


求各位指教。
...全文
242 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
afric_xw 2016-06-15
  • 打赏
  • 举报
回复
try{ error行 后面的代码不会再执行,跳到catch执行catch里面的方法 }catch(Exception e){ 记录 } 把记录的代码放到catch中去执行
网易云捕 2016-06-14
  • 打赏
  • 举报
回复
代码写的有问题。可以进一步调试进去跟踪。异常回调函数是同步的,应该是在某个地方处理出异常了,不存在拼速度的情况。
qq_35313269 2016-06-14
  • 打赏
  • 举报
回复
引用 1 楼 crash163 的回复:
结果经常是信息采集完,还没保存到txt,代码就不往下执行了。 ———————— 可以在handleException函数中打印log,通过2分法判断是在哪一步退出
打印Log调试过了,有一定次数是刚打印完Log.i("one", "进了");之后后面的Log都打印不出来,也有试过在 LogUtils.log2File2之前的Log能打印,后面不能打。也有试过全部都能打。用的是同一个地方抛的异常。只是不停地重新运行,结果打印出来的Log停的位置都不一样。好像在拼速度,要在APP全挂前能把异常存到文件就赢了。。这种感觉
网易云捕 2016-06-14
  • 打赏
  • 举报
回复
结果经常是信息采集完,还没保存到txt,代码就不往下执行了。 ———————— 可以在handleException函数中打印log,通过2分法判断是在哪一步退出

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧