此代码来自我们的项目,生产代码:
if (changedToNull) {
try {
throw new Exception();
} catch (Exception e) {
log.debug("changedToNull", e);
}
}
开发人员不再与我们合作。
为什么有人会抛出Exception
并直接捕获并记录它?
答案 0 :(得分:23)
主要目的是在您输入此if
块时获取调用堆栈以进行调试,但可以将其重写为下一个:
if (changedToNull) {
log.debug("changedToNull", new Exception("changedToNull is true"));
}
假设changedToNull
永远不应该是true
,并且您希望让调用堆栈了解它是如何发生的,您可以这样做。
创建调用堆栈非常昂贵,因此您应该通过检查debug
的值来确保isDebugEnabled()
级别已启用(假设您使用log4j
)作为下一个:
if (changedToNull && log.isDebugEnabled()) {
...
}
答案 1 :(得分:-5)
对我来说,这看起来像是无用的代码。有些人提到它会给你一个堆栈跟踪但是因为它只是创建一个新的Exception,堆栈跟踪不太可能提供很多有用的信息(除非在罕见的调试情况下)。
我会重新安排代码看起来像这样,甚至避免抛出异常:
if (changedToNull) {
log.debug("changedToNull");
}
如果开发人员想要查看代码(仍在开发中),那么理想情况下应该使用内置调试工具的IDE。
一般的经验法则是,除非代码在生产中有用,否则它可能也不存在,并且将它保留在那里有些不好的做法。这当然不包括测试。