60

在这样的 Android 异常中使用 printStackTrace() 是不是一个坏主意?

} catch (Exception e) {
    e.printStackTrace();
}
4

5 回答 5

48

我相信这是你需要的:

catch (Exception e) {
     Log.e(TAG,Log.getStackTraceString(e)); 
}
于 2011-10-25T17:12:48.530 回答
46

是的,这是个坏主意。您应该改用专门为这些目的设计的 Android 内置日志类:http: //developer.android.com/reference/android/util/Log.html

它为您提供了记录调试消息、警告、错误等的选项。

记录错误:

Log.e(TAG, "message", e)其中消息可以解释抛出异常时正在尝试的内容

或者只是Log.e(TAG, e)如果您不想为上下文提供任何消息

然后,您可以在运行代码时单击底部的日志控制台,并使用 TAG 或日志消息类型作为过滤器轻松搜索它

于 2010-10-04T13:28:28.810 回答
22

是的。printStackTrace()方便但不鼓励,特别是在 Android 上,它可以通过logcat但在未指定的级别被记录,并且没有正确的消息。相反,记录异常的正确方法是......

Log.e(TAG, "Explanation of what was being attempted", e);

请注意,异常用作第三个参数,而不是附加到消息参数。Log为您处理详细信息——打印您的消息(它给出了您在代码中尝试执行的操作的上下文)和Exception的消息,以及它的堆栈跟踪。

于 2016-05-05T18:05:09.153 回答
9

我会避免使用printStackTrace(),使用日志系统及其对异常的支持。

log.log(Level.SEVERE, "Uncaught exception", e);

因此,如果您想更改日志记录的处理方式,它会容易得多。

于 2010-10-04T12:48:58.990 回答
8

问题是:在 Andriod 应用程序上下文中打印到堆栈跟踪是否有用?标准输出在运行时是否可见?会有人关心吗?

我的观点是,如果没有人去检查标准输出并关心调试错误,那么对这个方法的调用就是死代码,编写堆栈跟踪消息是毫无价值的开销。如果仅在开发时需要它进行调试,则可以设置一个可访问的全局常量,并在运行时检查它:

} catch (Exception e) {
   if(com.foo.MyEnvironmentConstants.isDebugging()) {
      e.printStackTrace();
   } //else do noting
}
于 2010-10-04T12:37:05.813 回答