有什么理由抛出“异常”并立即捕获它吗?

2022-09-04 20:07:05

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

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

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

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


答案 1

主要目的是在输入此块以进行调试时获取调用堆栈,但可以将其重写为下一步:if

if (changedToNull) {
    log.debug("changedToNull", new Exception("changedToNull is true"));
}

假设永远不应该这样,并且您希望让调用堆栈了解它是如何发生的,您可以以这种方式进行。changedToNulltrue


创建调用堆栈非常昂贵,因此您应该通过检查 too 的值(假设您使用 )来确保启用该级别,如下所示:debugisDebugEnabled()log4j

if (changedToNull && log.isDebugEnabled()) {
    ...
}

答案 2

这对我来说似乎是一个无用的代码。有些人提到它会给你一个堆栈跟踪,但由于它只是创建一个新的异常,堆栈跟踪不太可能提供太多有用的信息(除非在罕见的调试情况下)。

我会重新排列代码,使其看起来像这样,甚至避免抛出异常:

if (changedToNull) {
    log.debug("changedToNull");
}

如果开发人员想要查看代码(在开发过程中),那么理想情况下,他们应该使用 IDE 内置的调试工具。

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