【问题标题】:Is it a bad idea to use printStackTrace() for caugt Exceptions?将 printStackTrace() 用于 caugt 异常是一个坏主意吗?
【发布时间】:2011-04-20 18:57:42
【问题描述】:

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

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

【问题讨论】:

    标签: java exception printstacktrace


    【解决方案1】:

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

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

    记录错误:

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

    如果您不希望提供任何上下文消息,请直接Log.e(TAG, e)

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

          catch (Exception e) {
               Log.e(TAG,Log.getStackTraceString(e)); 
          }
          

          【讨论】:

          • 不。 OP 需要的是Log.e(TAG, "Explanation of what was being attempted when the exception was thrown", e)。注意第三个参数。 Log.e(String,String,Throwable) 为您从 Throwable 获取堆栈跟踪字符串。将message 参数用于有意义的事情。
          • @spaarky21 你应该这样回答。
          • @AndreKR 有人已经这样做了。 :) 我赞成它。我只是想指出,这个答案是在宣传一种不好的做法,因为与正确答案相比,它的评价如此之高。
          • @spaaarky21 我从您的回答中了解到,我可以将异常传递给android.util.Log.e()。我没有从任何其他答案中学到这一点。 (我没有点击 Nailuj 回答中的链接。)
          • @AndreKR 谢谢。好点。我指的是 Ryan 的答案,但现在我再看一遍,我发现它以一种不寻常的方式使用 Log - 使用 Log 实例(我假设?)并将级别作为参数传递。我添加了一个答案。
          【解决方案5】:

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

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

          } catch (Exception e) {
             if(com.foo.MyEnvironmentConstants.isDebugging()) {
                e.printStackTrace();
             } //else do noting
          }
          

          【讨论】:

            猜你喜欢
            • 2010-09-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-25
            • 1970-01-01
            • 2012-04-02
            相关资源
            最近更新 更多