Java 对caugt异常使用printStackTrace()是个坏主意吗?
在Android异常中使用printStackTrace()是个坏主意吗Java 对caugt异常使用printStackTrace()是个坏主意吗?,java,exception,printstacktrace,Java,Exception,Printstacktrace,在Android异常中使用printStackTrace()是个坏主意吗 } catch (Exception e) { e.printStackTrace(); } 问题是:在Andriod应用程序上下文中,打印到堆栈跟踪是否有用? 标准输出在运行时是否可见?有人会在意吗 我的观点是,如果没有人检查标准输出并调试错误,那么对该方法的调用就是死代码,编写stacktrace消息是毫无价值的开销。如果只在开发时调试时需要它,可以设置一个可访问的全局常量,并在运行时检查它: } catch
} catch (Exception e) {
e.printStackTrace();
}
问题是:在Andriod应用程序上下文中,打印到堆栈跟踪是否有用? 标准输出在运行时是否可见?有人会在意吗 我的观点是,如果没有人检查标准输出并调试错误,那么对该方法的调用就是死代码,编写stacktrace消息是毫无价值的开销。如果只在开发时调试时需要它,可以设置一个可访问的全局常量,并在运行时检查它:
} catch (Exception e) {
if(com.foo.MyEnvironmentConstants.isDebugging()) {
e.printStackTrace();
} //else do noting
}
我将避免使用
printStackTrace()
,使用日志系统及其对异常的支持
log.log(Level.SEVERE, "Uncaught exception", e);
因此,如果您想更改日志记录的处理方式,这会容易得多。是的,这不是一个好主意。您应该改为使用Android的内置日志类,该类专门为以下目的而设计: 它为您提供了记录调试消息、警告、错误等的选项 使用以下命令记录错误:
Log.e(标记“message”,e)
其中消息可以解释引发异常时尝试的操作
或者如果您不希望为上下文提供任何消息,只需Log.e(TAG,e)
然后,您可以在运行代码时单击底部的日志控制台,并使用标记或日志消息类型作为过滤器轻松搜索它我相信这就是您需要的:
catch (Exception e) {
Log.e(TAG,Log.getStackTraceString(e));
}
对printStackTrace()
很方便,但不鼓励使用,尤其是在Android上,它可以通过logcat
看到,但会以未指定的级别记录,并且没有正确的消息。相反,记录异常的正确方法是
Log.e(TAG, "Explanation of what was being attempted", e);
请注意,异常用作第三个参数,而不是附加到消息参数<代码>日志为您处理详细信息–打印您的消息(其中给出了您试图在代码中执行的操作的上下文)和
异常
的消息及其堆栈跟踪。否。OP需要的是Log.e(标记,“抛出异常时尝试的内容的解释”,e)
。注意第三个参数。Log.e(String,String,Throwable)为您从Throwable中获取stacktrace字符串。使用message
参数进行有意义的操作。@spaaarky21您应该回答这个问题。@AndreKR有人已经回答了。:)我投了更高的票。我只是想指出,这个答案是在推广一种不好的做法,因为与正确答案相比,它的评分太高了。@spaaarky21我从你的答案中了解到,我可以将异常传递给android.util.Log.e()
。我没有从其他答案中学到这一点。(我没有点击Nailuj回答中的链接。)@AndreKR谢谢。这很有道理。我指的是Ryan的答案,但现在我再看一遍,我发现它以一种不同寻常的方式使用了Log
——使用Log
实例(我假设?),并将级别作为参数传入。我补充了一个答案。