有没有理由抛出“异常”并立即抓住它?

时间:2016-09-23 17:38:53

标签: java exception try-catch

此代码来自我们的项目,生产代码:

if (changedToNull) {
    try {
        throw new Exception();
    } catch (Exception e) {
        log.debug("changedToNull", e);
    }
}

开发人员不再与我们合作。

为什么有人会抛出Exception并直接捕获并记录它?

2 个答案:

答案 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。

一般的经验法则是,除非代码在生产中有用,否则它可能也不存在,并且将它保留在那里有些不好的做法。这当然不包括测试。