Java 记录异常,使用 getMessage 或 toString : log.warn(ex.getMessage()) 或 log.warn(ex) 使用开源
Posted
技术标签:
【中文标题】Java 记录异常,使用 getMessage 或 toString : log.warn(ex.getMessage()) 或 log.warn(ex) 使用开源【英文标题】:Java Logging exceptions, use getMessage or toString : log.warn(ex.getMessage()) or log.warn(ex) working with open source 【发布时间】:2015-04-01 02:07:00 【问题描述】:我的问题是:使用 getMessage 或 toString 或两者都记录更好?考虑到开源引发的错误。在 cmets 中看到了问题,但没有得到答案。也许我错过了什么?不要介意记录其中一个对性能的小幅影响,但除非有充分的理由,否则不要同时记录两者。
意思是log(ex)或者log(ex.getMessage),不是说堆栈跟踪。
看到1、2和3
记录异常:哪个更好: log.warn(ex.getMessage(), ex) 或 log.warn(ex, ex);
我注意到有时 getMessage 返回空或 null,所以在一般实践中是否有任何理由不使用:
log.warn(ex, ex);
似乎打印了类名和消息(如果设置)?我想一个原因可能是如果一个子类过度使用字符串不打印消息,但实际上任何休眠、apache 或 spring 库都这样做吗?
【问题讨论】:
Should you report the message text of exceptions?的可能重复 另见***.com/questions/7361201/… 正如两个链接的问题所示(这使得这个问题重复),我认为答案都不是。仅针对指示错误的异常记录堆栈跟踪;它们仅对程序员有用;错误的存在不仅仅是警告。不要在针对 fir 用户(而不是 orogrammers)的 lig 消息中使用异常的消息文本。 另见***.com/questions/2031163/… 通读所有链接的问题 - 它们绝对不是重复的...... 【参考方案1】:怎么样
log.warn("some descriptive message, maybe with context ",
someId, ex);
异常详细信息已经作为堆栈跟踪的一部分打印出来,因此您通常不需要将它们包含在消息中。
如果您想抑制堆栈跟踪并仅打印异常消息,通常ex.toString()
比ex.getMessage()
效果更好,因为它还包含异常类名称,而消息不包含。事实上,消息通常是空的(例如 NullPointerExceptions)。
【讨论】:
是的,已经这样做了,打印本地变量等并使用 AOP 作为方法参数,更多的是关于异常本身 toStirng 或 getMessage 或两者兼而有之?更新问题 如果您想将您的问题改写为log.warn(ex);
和log.warn(ex.getMessage())
(只有这两个选项),那么是的:我投票支持第一个。这包括docs.oracle.com/javase/7/docs/api/java/lang/… 指定的消息,有人可以覆盖它以使其不那么有用吗?我猜。但我从未见过这种情况发生。
你可以编辑你的答案来讨论异常 getMessage 和 toString 吗?
答案确实有点误导,因为通常很常见的错误是期望在记录的行之后只记录堆栈跟踪就足够了。因为在许多情况下,您需要已经在第一行记录异常详细信息,以便能够有效地查找错误,例如。 G。使用 grep
之类的工具通过异常名称搜索记录的行时。以上是关于Java 记录异常,使用 getMessage 或 toString : log.warn(ex.getMessage()) 或 log.warn(ex) 使用开源的主要内容,如果未能解决你的问题,请参考以下文章
java知识点异常e.getMessage()与e.printStackTrace()的区别
java知识点异常Java 异常Exception e中e的getMessage()和toString()方法的区别
Java 异常Exception e中e的getMessage()和toString()以及 e.printStackTrace();方法的区别