在Android Exceptions中使用printStackTrace()是一个坏主意吗?

jac*_*nad 56 java exception printstacktrace

在像这样的Android Exceptions中使用printStackTrace()是一个坏主意吗?

} catch (Exception e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

小智 47

我相信这就是你所需要的:

catch (Exception e) {
     Log.e(TAG,Log.getStackTraceString(e)); 
}
Run Code Online (Sandbox Code Playgroud)

  • 不.OP需要的是`Log.e(TAG,"抛出异常时所尝试的内容的解释",e)`.注意第三个参数.Log.e(String,String,Throwable)为您从Throwable获取stacktrace字符串.使用`message`参数来表示有意义的事情. (44认同)
  • @AndreKR 有人已经这样做了。:) 我赞成它。我只是想指出这个答案是在宣扬一种不好的做法,因为与正确答案相比,它的评分如此之高。 (2认同)

Jul*_*ian 38

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

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

记录错误:

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

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

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


spa*_*y21 19

是.printStackTrace()很方便,但气馁,特别是在Android上,它可见,logcat但在未指定的级别登录,没有正确的消息.相反,记录异常的正确方法是......

Log.e(TAG, "Explanation of what was being attempted", e);
Run Code Online (Sandbox Code Playgroud)

请注意,该异常用作第三个参数,不会附加到message参数.Log为您处理细节 - 打印您的消息(提供您在代码中尝试执行的操作的上下文)和Exception消息,以及其堆栈跟踪.


Tom*_*ros 9

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

我的观点是,如果没有人要检查标准输出并注意调试错误,则对此方法的调用是死代码,并且编写堆栈跟踪消息是一项毫无价值的开销.如果只需要在开发时调试它,可以设置一个可访问的全局常量,并在运行时检查它:

} catch (Exception e) {
   if(com.foo.MyEnvironmentConstants.isDebugging()) {
      e.printStackTrace();
   } //else do noting
}
Run Code Online (Sandbox Code Playgroud)


Rya*_*yan 9

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

log.log(Level.SEVERE, "Uncaught exception", e);
Run Code Online (Sandbox Code Playgroud)

因此,如果您想要更改日志记录的处理方式,那就容易多了.