全局捕获所有可能的android异常并重新加载应用程序

Posted

技术标签:

【中文标题】全局捕获所有可能的android异常并重新加载应用程序【英文标题】:Catch all possible android exception globally and reload application 【发布时间】:2015-11-20 15:26:15 【问题描述】:

我知道防止系统崩溃的最佳方法是用不同的方法捕获所有可能的异常。所以我在代码中的每个地方都使用了 try catch 块。但是,如您所知,有时您会忘记测试一些导致一些未经处理的异常的场景,并且用户会收到“不幸的是应用程序停止工作......”消息。这对任何应用程序都是不利的。不幸的是,将使用我的应用程序的人不是以英语为母语的,所以他们也不会理解崩溃消息。

所以我想知道是否有可能全局捕获所有可能的异常(在某些主类中只有一个 try catch 块,而不是所有类和方法!!!)并且自动重新加载应用程序并且没有有什么奇怪的信息吗?或者至少可以更改崩溃消息

谢谢。

【问题讨论】:

我相信弹出消息会以用户语言出现。 我不确定。但我知道这条消息“不幸的是应用程序停止工作......”对大多数人来说并不是一个好消息。 【参考方案1】:

在你的 onCreate 中

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() 
            @Override
            public void uncaughtException(Thread paramThread, Throwable paramThrowable) 
                //Catch your exception
                // Without System.exit() this will not work.
                System.exit(2);
            
        );

【讨论】:

您可以在所有活动上使用它,片段的父活动将处理这些异常。你真的需要退出,如果没有尴尬的黑客攻击,重新加载是不可能的,即运行一个单独的应用程序服务以再次启动应用程序等。 为什么使用 2 作为 System.exit 的参数?非零参数之间有什么区别吗?我知道他们是因为错误而退出。 除了 0 = 错误之外的错误发生之外,它并没有真正的意思 谢谢,我在 System.exit 之前使用了 Toast,但它没有显示 Toast。 System.exit 是否有可能阻止显示? 我应该想象这是因为应用程序崩溃了。在该线程上您无能为力。只需在新线程中显示吐司【参考方案2】:

所以我想知道是否可以全局捕获所有可能的异常...并自动重新加载应用程序

不要这样做。如果您的应用进入一种状态,即使只是启动它也会导致崩溃,您将创建一个用户无法摆脱的无限循环的崩溃和重新启动。 p>

错误信息并不奇怪;它是系统消息,它被翻译成设备上所有支持的语言。

您唯一应该做的就是使用某种crash reporting library 向您报告崩溃,而无需用户执行任何操作,这样您就可以修复您的应用并提交更新。您可以在应用程序的onCreate() 中设置自定义UncaughtExceptionHandler,但我会将其限制为记录数据并可能准备将其发送给您以进行调试,然后将调用转发回默认的UncaughtExceptionHandler 。这正是崩溃报告库的作用。

我知道防止系统崩溃的最佳方法是用不同的方法捕获所有可能的异常。所以我在代码中的每一个地方都使用 try catch 块。

不,这是在发布之前编写好代码和修复错误的最佳方式。不加选择地捕获所有形式的异常被认为是不好的做法。您应该仅在以下情况下使用 try-catch 块

    方法调用可能会引发检查异常,在这种情况下,编译器会强制您使用 try-catch 包围或重新引发异常;或 您希望处理某些未经检查的(运行时)异常。例如,使用 Integer.parseInt() 之类的内容解析用户输入,捕获 NumberFormatException 并向用户显示他们的输入无效的消息。

但如您所知,有时您会忘记测试某些场景

然后改进您的编码和测试实践。不要以此为借口轻率行事。

不幸的是,使用我的应用程序的人不是以英语为母语的,所以他们也不会理解崩溃消息。

哪个崩溃消息?如果您指的是系统的崩溃消息,那应该是他们将设备设置为的任何语言。如果你的意思是你的崩溃消息(例如在 logcat 中),他们不应该这样做。他们应该向您发送崩溃消息,您应该修复应用程序并分发更新。不要指望最终用户在确定导致您的应用程序崩溃的原因时做任何工作。最好使用某种崩溃报告库。

【讨论】:

请记住他问的是怎么做,而不是他为什么不应该这样做 @xBroak 当答案对用户、用户的设备以及同一设备上的其他应用程序产生重大影响时,我认为不提及它们是不负责任的。 当然!但它应该以他的问题的答案为前缀。【参考方案3】:

你去吧:

    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() 
    @Override
    public void uncaughtException(Thread paramThread, Throwable paramThrowable) 

        new Thread() 
            @Override
            public void run() 
                Looper.prepare();
                Toast.makeText(getActivity(),"Your message", Toast.LENGTH_LONG).show();
                Looper.loop();
            
        .start();
        try
        
            Thread.sleep(4000); // Let the Toast display before app will get shutdown
        
        catch (InterruptedException e)     
        System.exit(2);
    
);

【讨论】:

贵吗??我的意思是它需要任何类型的电池耗尽吗?

以上是关于全局捕获所有可能的android异常并重新加载应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Android设置全局异常捕获在baseActivity注册,才能捕获所有的activity的异常

在 Android 中设置全局未捕获异常处理程序的理想方法

Android应用捕获全局异常自定义处理

Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )

Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )

Android 捕获全局异常CrashHandler,防止异常闪退,记录异常日志