记录异常并抛出新异常 - 它是反模式吗?

logging exception and throwing new exception - is it antipattern?

如果我们捕获异常然后抛出异常,但不是同一类型(仅基于第一个)是否仍然是反模式记录第一个?

简单示例:

    } catch (CloneNotSupportedException e) {
      log.warn(e, e.getMessage());
      throw new InternalError(e.getMessage());
    }

捕获 exception,创建日志消息并抛出新的 exception 根本不是反模式。

通常,当您有一个 interaction/communication 跨越某个系统边界时,这个 "pattern" 就会发挥作用,例如两层、模块或组件之间的通信。例如,这可以是客户端服务器交互,应用层与持久层交互或模块 x 调用模块 y 的服务。

让我们仔细看看该模式的动作。

记录异常? 您希望在异常发生的地方记录异常。这并不意味着您必须在它发生的地方记录它,但至少在您的上下文中。 另外,请考虑您的日志记录配置。您可能有包、组件、系统...相关配置,并且您希望确保在正确的日志中看到异常。

抛出新异常? 通常,新异常是旧异常的抽象。这很有用,因为方法调用者不必处理很多不同的异常。 此外,您不希望调用者始终详细了解您的上下文中发生的情况,因此使用新的异常允许您隐藏信息。

捕获异常? 显然,这是执行其他操作所必需的。