Java Android截获未处理的异常
因此,我想截获未处理的异常,我通过以下方式实现:Java Android截获未处理的异常,java,android,exception,exception-handling,Java,Android,Exception,Exception Handling,因此,我想截获未处理的异常,我通过以下方式实现: Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { //MY CUSTOM CODE TO SEND LOGS System
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
//MY CUSTOM CODE TO SEND LOGS
System.exit(2);
}
});
我是否可以执行自定义代码,然后恢复它处理这些异常的正常方式?我相信我遇到了一些悬而未决的问题,因为
系统。exit
似乎工作不可靠。您必须首先获得默认处理程序。然后拦截错误并将其发送给处理程序。系统,退出。。。这是个坏主意
因此,首先创建一个自定义exceptionhandler,如下所示:
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方法中(最好在自定义应用程序类中使用,以使其包含所有部分),如果尚未设置默认异常处理程序,则设置默认异常处理程序(在应用程序中选中not needed):
我编写了它(删除BuildConfig.DEBUG检查),实现它是为了直接启动电子邮件客户端。如果没有安装电子邮件客户端,您应该捕获调用
线程.getDefaultUncaughtExceptionHandler().uncaughtException(线程,ex)
以获取默认行为,如果这是您的意思的话。请参阅。@commonware,这样我就可以基本上执行自己的逻辑,然后在我发布的上述代码中调用Thread.getDefaultUncaughtExceptionHandler().uncaughtException(Thread,ex)
?是的。这将触发正常错误对话框,由Android提供,并由Play Store(或其他设备上的其他分发渠道)进行扩展。@Commonware我尝试过,但它似乎不会自动终止应用程序。我只是把它挂起来。如果你完全移除你的UncaughtExceptionHandler
,会发生什么?我知道你在做什么。CustomExceptionHandler
如何访问defaultUEH
?在类中拥有类,或者使用构造函数。更新了我的答案。听起来不错,我会尝试一下,一旦我更新了问题。
Thread.UncaughtExceptionHandler defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
if (!(defaultUEH instanceof CustomExceptionHandler)) {
Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(defaultUEH));
}