这个问题是由围绕本文的讨论引发的,当时我没有得到任何好的答案。
如果不能以其他方式处理异常,为什么应该记录异常然后将其重新抛出(当然,保留原始堆栈跟踪)是一个坏主意呢?
Answers:
我认为答案主要是因为如果无法处理,为什么要抓住它?如果他们认为值得使用日志,为什么不让任何人可以处理(或者什么也别无选择,只能处理)。
如果捕获并记录并重新抛出它,那么上游代码将无法知道您已经记录了该异常,因此同一异常可能会记录两次。更糟糕的是,如果所有上游代码都遵循相同的模式,则异常可能会被记录任意次,对于决定捕获该异常,记录该异常然后再次抛出该异常的代码中的每个级别都记录一次。
也可能有人认为,由于抛出和捕获异常是相对昂贵的操作,因此所有这些捕获和重新抛出都无助于提高运行时性能。简洁或可维护性也无济于事。
如果实体捕获并重新抛出异常有理由认为,它包含的信息将不会在调用堆栈的更远的地方进行记录-至少不是以最期望的方式,则日志记录是一种很好的模式。可能发生的几种原因:
e.getMessage()
在UI上显示/ stacktrace以及将其作为REST响应发送)应视为漏洞本身,因为运行时异常可能包含任何敏感信息。关于#2:您可以重新引发异常,添加希望客户端知道的所有信息(+根本原因),而无需记录任何内容。
我想最简单的原因是,通常您需要一个顶级处理程序为您执行此操作,因此无需使用此异常处理来污染代码。
横切关注点论点基本上是浪费时间来处理与您无关的错误。最好让错误在调用堆栈中冒泡,直到找到合适的处理程序为止。
我认为,唯一可以捕获异常的情况是可以对结果进行有用的处理。仅捕获日志是没有用的,因为您可以进一步集中工作。