所以我想拦截未处理的异常,我通过以下方式做到这一点:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
//MY CUSTOM CODE TO SEND LOGS
System.exit(2);
}
});
无论如何我可以执行我的自定义代码,然后恢复处理这些异常的正常方式吗?我相信我遇到了一些悬而未决的问题,因为 System.exit
似乎无法可靠地工作。
最佳答案
您必须先获取默认处理程序。然后拦截并将错误发送给处理程序。 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
。
关于java - Android拦截未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29110279/