【问题标题】:Is there any reason to throw an 'Exception' and catch it immediately? [duplicate]是否有任何理由抛出“异常”并立即捕获它? [复制]
【发布时间】:2017-02-01 15:45:56
【问题描述】:

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

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

开发者不再与我们合作。

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

【问题讨论】:

  • 它可以让你获得堆栈跟踪。
  • 如果这就是它的全部,那么它没有任何意义。如果由于复杂的业务决策而引发了多个异常类型并单独处理,那可能是可以接受的。但是使用异常来整体控制程序流并不是最佳实践。
  • @resueman 没必要为此扔。
  • +1 表示好奇。当事情看起来很奇怪时,开发人员应该有他们所做的事情的理由。对于开发人员来说,认识到奇怪的东西是一个很好的特质,并且询问它比仅仅撕掉它更好。这就是 cmets 真正 派上用场的地方。 (虽然我不宽恕被质疑的代码)
  • @Tunaki 抱歉,但我不同意你的建议,因为重复确实是同一个问题,但它完全是一个不同的用例,在这里不适用。实际上,它解释了如何在 标准错误流 中打印异常,这不是这里的情况(顺便说一句,这是一种糟糕的做法),使用 Thread.dumpStack() 在这里不适用,Thread.currentThread().getStackTrace() 不会带来任何与此上下文相关的内容。

标签: java exception try-catch


【解决方案1】:

主要目的是当你进入这个if块时获得一个调用堆栈用于调试目的,但它可以重写为下一个:

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

假设changedToNull 永远不应该是true,并且您想获取调用堆栈以了解它是如何发生的,您可以这样继续。


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

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

【讨论】:

    【解决方案2】:

    对我来说,这看起来像是一段无用的代码。有些人提到它会给你一个堆栈跟踪,但因为它只是创建一个新的异常,堆栈跟踪不太可能提供很多有用的信息(除非在极少数调试情况下)。

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

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

    如果开发人员想要查看代码(仍在开发中),那么他们最好使用 IDE 内置的调试工具。

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

    【讨论】:

    • 堆栈跟踪将与任何其他跟踪一样有用。它会显示谁调用了相关代码。
    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    相关资源
    最近更新 更多