【问题标题】:Android : avoid crashing of app due to unhandled errorsAndroid:避免由于未处理的错误导致应用程序崩溃
【发布时间】:2011-09-03 10:50:23
【问题描述】:

在我的 Android 应用程序中,我尝试将 Try Catch 块放在所有可能的位置。但是,我想避免由于任何未处理的错误而导致应用程序崩溃。我怎样才能做到这一点?

我使用了Thread.setDefaultUncaughtExceptionHandler(handler);,但这只会帮助我获取崩溃数据,对吗?

【问题讨论】:

    标签: android exception-handling


    【解决方案1】:

    你为什么要这样做?

    如果您可以在某些地方捕获异常并做一些有意义的事情,即显示有用的警告,然后以一致且可用的状态继续应用程序,那么很好。

    如果你不能采取任何有意义的行动,那就让失败发生吧。有很多方法可以通知您由此产生的故障,因此您可以修复它们:例如,查看ACRA。或者,Android 开发者控制台现在将报告您在市场上分发的应用程序失败。

    【讨论】:

    • @Glenn,“你为什么要这样做?”是一个完全有效的回应。答案不一定是对问题的直接答案。它可以是“你不应该那样做,你有没有尝试过考虑这个?”的形式。 (请参阅 SO 常见问题解答)。在这种情况下,吞下所有异常是一种非常糟糕的做法。捕获所有内容并允许您的应用程序“蒙混过关”并不是一个好主意,因为它恰好处于任何不一致的状态。最好处理特定情况,您可以向用户提供有意义的反馈或对什么采取有意义的行动出错了。
    • 这是一个响应。这不是答案。
    【解决方案2】:

    我建议你阅读 ACRA here

    【讨论】:

      【解决方案3】:

      所有错误和异常都从 Throwable 扩展而来。通过捕获 Throwable,可以处理所有意外情况。但是捕捉错误不会有任何结果。您可以在应用程序崩溃之前在 catch 块中做某事

      【讨论】:

        【解决方案4】:

        【讨论】:

          【解决方案5】:

          您可以使用以下方式:

          public class MyApplication extends Application
          {
            public void onCreate ()
            {
              // Setup handler for uncaught exceptions.
              Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
              {
                @Override
                public void uncaughtException (Thread thread, Throwable e)
                {
                  handleUncaughtException (thread, e);
                }
              });
            }
          
           // here you can handle all unexpected crashes 
            public void handleUncaughtException (Thread thread, Throwable e)
            {
              e.printStackTrace(); // not all Android versions will print the stack trace automatically
          
              Intent intent = new Intent ();
              intent.setAction ("com.mydomain.SEND_LOG"); // see step 5.
              intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK); // required when starting from Application
              startActivity (intent);
          
              System.exit(1); // kill off the crashed app
            }
          }
          

          这将处理您的应用意外崩溃,这取自 that answer

          【讨论】:

          • 为什么最后通过System.exit()杀掉了这个应用?如果崩溃是不影响视图或功能的事情,难道不能让它继续运行吗?
          • @avalancha 抱歉刚刚注意到您的评论,实际上它正在杀死当前实例并发布一个新的应用程序实例(我记得 :D)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-08
          相关资源
          最近更新 更多