Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android截获未处理的异常_Java_Android_Exception_Exception Handling - Fatal编程技术网

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));
}