如果我们捕获异常然后我们抛出异常,但不是同一类型(仅基于第一个)是否仍然是反模式来记录第一个?
简单示例:
} catch (CloneNotSupportedException e) {
log.warn(e, e.getMessage());
throw new InternalError(e.getMessage());
}
答案 0 :(得分:3)
捕获exception
,创建日志消息并抛出新的exception
根本不是反模式。
通常,这种"模式"当你有一个跨越某个系统边界的交互/通信时起作用,例如两层,模块或组件之间的通信。例如,这可以是客户端服务器交互,应用程序层与持久层交互,或模块x调用模块y的服务。
让我们仔细看看模式的行为。
记录异常? 您希望在发生异常的位置记录异常。这并不意味着您必须将其记录在发生的位置,但至少在您的环境中。 另外,请考虑您的日志记录配置。您可能有包,组件,系统......相关配置,并且您希望确保在正确的日志中看到异常。
抛出新的异常? 通常,新异常是旧异常的抽象。这很有用,因为调用方法不必处理很多不同的异常。 此外,您并不总是希望来电者详细了解您的上下文中发生了什么,因此使用新的例外可以隐藏信息。
抓住异常? 显然,需要执行其他操作。