在Android中使用e.printStackTrace()出现困惑

3

我在这里读到,e.printStackTrace()不应该用于捕获Android上的异常。

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

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

在发布版本中,我是否需要手动删除这些调用?在Android中跟踪异常日志的最佳实践是什么?


2
很好,你记录实际错误以便进一步参考程序问题,而不是显示堆栈跟踪。 :) - Tom Wellbrock
1
如果你使用e.printStackTrace,系统会将所有信息写入标准输出,最好使用日志记录器,这样你可以将所有输出重定向到某个文件中...并且可以在不更改代码的情况下更改要写入该文件的内容。 - David Herrero
在发布版本中,我是否需要删除Log.e()调用? - Mike76
这取决于您。但我建议不要删除它们。例如,您可以将它们存储在文件中。如果您的用户遇到问题并希望获得支持,他可以发送错误日志给您,这有助于您进行调试。 - Tom Wellbrock
1
e.printStackPrace() 继承自 Java。Log.e() 更加专属于 Android,它是在 Android 中记录错误的更加适当的方式。 - Krypton
显示剩余6条评论
1个回答

2
捕获异常的主要目的,当然是处理发生的问题,因此您的 catch 部分应始终以某种方式处理错误,例如为未能正常工作的内容使用默认值,或尝试其他方法。
无论如何,如果您计划在 Google Play 商店 中发布您的应用程序,并且希望记录异常并将其用于调试目的,以进一步改进应用程序,您可以使用 Google Analytics API 处理异常部分。它还提供了收集堆栈跟踪信息的功能。(这是 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 开发者控制台选项卡中显示。

Crashed and ANR' in the Google Developer Console (picture taken from the web)

您还可以添加一个监听器来捕获未处理的异常。因此,每当发生意外异常时,将调用此处理程序。
Thread.setDefaultUncaughtExceptionHandler(new MyReportHelper());

当然,您应该始终尝试捕获和处理所有您知道的异常,这个处理程序仅用于紧急情况。有关处理程序可能看起来像的更多详细信息,请参见此处

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接