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

Tah*_*her 15 error-handling android try-catch

我知道防止系统崩溃的最佳方法是在不同的方法中捕获所有可能的异常.所以我在代码中的每个位置使用try catch块.但是,正如您所知,有时您会忘记测试某些导致某些无法处理的异常的情况,并且用户会收到"不幸的应用已停止工作..."消息.这对任何应用都不好.不幸的是,使用我的应用程序的人不是本地英语,因此他们也不会理解崩溃消息.

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

谢谢.

Bro*_*oak 20

在你的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);
            }
        });
Run Code Online (Sandbox Code Playgroud)

  • 您可以在所有活动上使用它,片段的父活动将处理这些异常。您将需要退出,如果没有笨拙的hack,即无法运行单独的应用服务以再次启动应用,则无法重新加载。 (2认同)
  • 为什么使用2作为System.exit的参数?非零参数之间有什么区别吗?我知道他们是因为出错而退出的. (2认同)
  • 我应该想象这是因为应用程序崩溃了。在该线程上您无能为力。只需在新线程中显示吐司 (2认同)

Kar*_*uri 6

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

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

错误消息并不奇怪;它是系统消息,并且已翻译为设备上所有受支持的语言。

您唯一要做的就是使用某种崩溃报告库,无需用户做任何事情即可向您报告崩溃,以便您可以修复应用程序并提交更新。您可以UncaughtExceptionHandler在Application的应用程序中设置自定义onCreate(),但我将其限制为记录数据,并可能准备将其发送给您以进行调试,然后将调用转发回defaultUncaughtExceptionHandler。这正是崩溃报告库所做的。

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

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

  1. 方法调用可以引发一个检查异常,在这种情况下,编译器会强制您用try-catch包围或重新引发该异常;要么
  2. 您要处理某些未检查的(运行时)异常。一个示例是使用诸如解析用户输入Integer.parseInt(),捕获NumberFormatException和向用户显示其输入无效的消息。

但是,正如您所知,有时您忘记测试某些方案

然后改善您的编码和测试实践。请勿以此为借口采取轻率行动。

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

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

  • 请记住,他问怎么做,而不是为什么他不应该这样做 (7认同)
  • @xBroak当答案对用户,用户的设备以及同一设备上的其他应用有重大影响时,我认为不提它们是不负责任的。 (4认同)
  • 当然!但它应该以他的问题的答案作为前缀。 (4认同)

Ham*_*ian 5

你去吧:

    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);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 很贵吗??我的意思是它需要消耗任何类型的电池吗? (3认同)