【问题标题】:Confusion with e.printStackTrace() in Android与 Android 中的 e.printStackTrace() 混淆
【发布时间】:2015-12-26 14:33:16
【问题描述】:

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

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

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

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

【问题讨论】:

  • 究竟是在哪里读到的?
  • 好吧,而不是显示 aStackTrace 您记录实际错误以进一步参考您的程序问题。那很好:)
  • 如果您使用 e.printStackTrace 系统将在标准输出中写入所有这些信息,总是最好使用记录器,这样您就可以将所有输出重定向到某个文件......然后改变你做什么想要在不接触代码的情况下写入该文件。
  • e.printStackPrace() 继承自 Java。 Log.e() 更特定于 Android,它绝对是一种在 Android 中记录错误的更合适的方法。

标签: java android exception exception-handling printstacktrace


【解决方案1】:

捕获异常的主要目的当然是处理正在发生的问题,因此您的 catch 部分应该始终以某种方式处理错误,例如对不起作用的东西使用默认值,或者尝试不同的东西。

无论如何,如果您打算在 Google Play 商店 中发布您的应用,并且如果您想记录异常并将它们用于调试目的,那么您可以使用 Google Analytics API part for handling exceptions 进一步改进应用.它还提供了收集堆栈跟踪的工具。 (这是来自 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.
}

之后,所有跟踪的 stracktraces 都将显示在您的应用程序中的 Google Developer Console 中。

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

Thread.setDefaultUncaughtExceptionHandler(new MyReportHelper());

当然,您应该始终尝试捕获并处理您知道的所有异常,此处理程序仅用于紧急情况。有关处理程序外观的更多详细信息,请参阅here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2015-11-10
    相关资源
    最近更新 更多