异常处理程序应该提供上下文信息并且保留原始异常

本文介绍了在软件开发中处理异常的最佳实践,包括如何保留原始异常信息、如何为异常提供上下文信息,以及何时应该传播异常而不是捕获它们。还讨论了受控异常与运行时异常之间的转换策略。
     Exception handlers should provide some context and preserve the original exception

处理异常时,需要进行两个操作:
1、使用context减缓复制的问题
2、保留原始异常信息,进行堆栈问题的追踪( stack trace )

看一些例子:

try { /* ... */ } catch (Exception e) { LOGGER.info("context"); }         // Non-Compliant - exception is lost
try { /* ... */ } catch (Exception e) { LOGGER.info(e); }                 // Non-Compliant - context is required
try { /* ... */ } catch (Exception e) { LOGGER.info(e.getMessage()); }    // Non-Compliant - exception is lost (only message is preserved)

try { /* ... */ } catch (Exception e) { LOGGER.info("context", e); }      // Compliant(符合规范)

try {
  /* ... */
} catch (Exception e) {                                                   // Non-Compliant - exception is lost
  throw new RuntimeException("context");
}

try {
  /* ... */
} catch (Exception e) {                                                   // Compliant
  throw new RuntimeException("context", e);
}

一般性的异常,所有问题都必须要处理,但是对于一些特殊的异常,必须使用传播( propagation ),而且这时的传播是允许的。
try {
  /* ... */
} catch (RuntimeException e) {            // Compliant - propagation of the specific exception
  throw e;
} catch (Exception e) {                   // Compliant - catching of the general exception
  LOGGER.error("...", e);
}
受控制的Exception转换成Runtime Exception减缓受控异常的传播。
try {
  /* ... */
} catch (IOException e) {            // Compliant - propagation of checked exception by encapsulating it into an unchecked exception
  throw new MyRuntimeException(e);
}

不管是log还是重新抛出异常都伴随着context的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值