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

时间:2017-01-03 12:27:11

标签: java exception logging try-catch anti-patterns

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

简单示例:

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

1 个答案:

答案 0 :(得分:3)

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

通常,这种"模式"当你有一个跨越某个系统边界的交互/通信时起作用,例如两层,模块或组件之间的通信。例如,这可以是客户端服务器交互,应用程序层与持久层交互,或模块x调用模块y的服务。

让我们仔细看看模式的行为。

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

抛出新的异常? 通常,新异常是旧异常的抽象。这很有用,因为调用方法不必处理很多不同的异常。 此外,您并不总是希望来电者详细了解您的上下文中发生了什么,因此使用新的例外可以隐藏信息。

抓住异常? 显然,需要执行其他操作。