与Android中的e.printStackTrace()混淆

时间:2015-09-29 07:43:55

标签: java android exception exception-handling printstacktrace

我读到here e.printStackTrace()不应该用来捕获android上的异常。

在另一个来源我读到我应该使用Log.e()而不是e.printStackTrace()

... catch (Exception e) {
 Log.e(TAG, "Foo did not work", e);
}

我是否必须在发布版本中手动删除这些调用?在Android中跟踪异常日志的最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

捕获异常的主要目的当然是处理一个问题,因此你的 catch 部分应该总是以某种方式处理错误,例如:对于不起作用的东西使用默认值,或尝试不同的东西。

无论如何,如果您打算在 Google Play商店中发布您的应用,并且如果您想记录例外情况并将其用于调试工作,那么为了进一步改进应用,您可以使用{{3 }}。它还提供用于收集堆栈跟踪的工具。 (这是API页面的例子)

// Using StandardExceptionParser to get an Exception description.
try {

  // Request some scores from the network.
  ArrayList<Integer> highScores = getHighScoresFromCloud();

} catch (IOException e) {
// Get tracker.
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
    TrackerName.APP_TRACKER);

  t.send(new HitBuilders.ExceptionBuilder()
      .setDescription(
          new StandardExceptionParser(this, null)
              .getDescription(Thread.currentThread().getName(), e))
      .setFatal(false)
      .build()
  );

  ... // Display alert to user that high scores are currently unavailable.
}

之后,所有跟踪过的痕迹将通过您的应用程序显示在Google Developer Console中。

Google Analytics API part for handling exceptions

您还可以添加一个侦听器来捕获未处理的异常。因此,每当发生异常时,您就不会发生调用处理程序。

Thread.setDefaultUncaughtExceptionHandler(new MyReportHelper());

当然,您应该始终尝试捕获并处理您知道的所有异常,此处理程序仅用于紧急情况。有关处理程序的详细信息,请参阅Crashed and ANR' in the Google Developer Console (picture taken from the web)