【发布时间】:2011-10-02 04:03:39
【问题描述】:
【问题讨论】:
标签: logging exception-handling anti-patterns
【问题讨论】:
标签: logging exception-handling anti-patterns
我认为答案很大程度上是因为如果你不能处理它,你为什么要抓住它?如果他们认为它值得记录,为什么不让任何可以处理它的人(或者除了处理它别无选择的人)记录它?
如果您捕获并记录它并重新抛出它,那么上游代码将无法知道您已经记录了异常,因此相同的异常可能会被记录两次。或者更糟糕的是,如果所有上游代码都遵循相同的模式,则异常可能会被记录任意次数,对于决定捕获它、记录它然后再次抛出它的代码中的每个级别一次。
还有一些人可能会争辩说,由于抛出和捕获异常是相对昂贵的操作,所有这些捕获和重新抛出都不会帮助您提高运行时性能。它在简洁性或可维护性方面也对您的代码没有帮助。
【讨论】:
Log-and-throw 是一个很好的模式,如果实体捕获并重新抛出异常有理由相信它包含不会被进一步记录到调用堆栈上的信息——至少不是以最理想的方式。发生这种情况的几个原因:
【讨论】:
e.getMessage()/stacktrace,以及将其作为 REST 响应发送)应视为漏洞本身,因为运行时异常可能包含任何类型的敏感信息。关于#2:您可以重新抛出异常,添加您希望客户知道的所有信息(+根本原因),无需记录任何内容。
我想最简单的原因是您通常会有一个顶级处理程序为您执行此操作,因此无需使用此异常处理来污染代码。
横切关注点的论点基本上是浪费时间处理与您无关的错误。最好让错误在调用堆栈中冒泡,直到找到合适的处理程序。
在我看来,您应该捕获异常的唯一时间是您可以对结果做一些有用的事情。仅仅为了记录而捕获是没有用的,因为您可以进一步集中该工作。
【讨论】:
IMO log and throw 明显违反了最小意外原则。
如果异常在调用堆栈的更上层得到正确处理,则可能根本不值得输入错误日志。然后发现错误日志条目令人困惑。
【讨论】: