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

时间:2015-08-26 14:16:54

标签: android error-handling try-catch

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

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

感谢。

3 个答案:

答案 0 :(得分:14)

在你的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);
            }
        });

答案 1 :(得分:3)

  

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

不要这样做。如果你的应用程序进入即使只是启动它就会导致崩溃的状态,你将创建一个无休止的崩溃和重新启动循环,用户无法摆脱。

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

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

  

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

不,是在发布之前编写好代码并修复错误的最佳方法。不加区分地捕捉所有形式的例外被认为是不好的做法。你应该只使用try-catch块

  1. 方法调用可以抛出一个已检查的异常,在这种情况下,编译器强制您使用try-catch包围或重新抛出异常;或
  2. 您想要处理某些未经检查(运行时)的异常。一个例子是用Integer.parseInt()解析用户输入,捕获NumberFormatException并向用户显示他们的输入无效的消息。
  3.   

    但是你知道有时你会忘记测试一些场景

    然后改进您的编码和测试实践。不要以此为借口采取鲁莽行动。

      

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

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

答案 2 :(得分:1)

你去了:

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