所以我想拦截未处理的异常,我这样做是通过:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
//MY CUSTOM CODE TO SEND LOGS
System.exit(2);
}
});
无论如何,我可以执行自定义代码,然后恢复处理这些异常的正常方式吗?我相信我遇到了一些悬而未决的问题,因为System.exit
似乎没有可靠的工作。
答案 0 :(得分:2)
您必须先获取默认处理程序。然后拦截并发送错误处理程序。 System.exit ......是个坏主意。
首先,您创建一个自定义异常处理程序,如下所示:
public class CustomExceptionHandler implements Thread.UncaughtExceptionHandler {
private final Thread.UncaughtExceptionHandler defaultUEH;
public CustomExceptionHandler(Thread.UncaughtExceptionHandler defaultUEH) {
this.defaultUEH = defaultUEH;
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
String stackTrace = Log.getStackTraceString(ex);
String time = new Date(System.currentTimeMillis()).toString();
String message = ex.getMessage();
// send logs...
defaultUEH.uncaughtException(thread, ex);
}
}
所以基本上在你的onCreate方法中(最好在自定义Application类中使用它使它落入所有部分)设置默认的异常处理程序(如果尚未设置)(在Application中不需要检查):
Thread.UncaughtExceptionHandler defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
if (!(defaultUEH instanceof CustomExceptionHandler)) {
Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(defaultUEH));
}
我写了here(删除BuildConfig.DEBUG检查),直接启动电子邮件客户端。如果没有安装电子邮件客户端,则应该捕获ActivityNotFoundException
。