这个问题是由这篇文章所引起的讨论,我没有得到任何好的答案。
如果你不能以其他方式处理异常,为什么记录异常并重新抛出它(当然要保留原始的堆栈跟踪)会是一个不好的想法?
这个问题是由这篇文章所引起的讨论,我没有得到任何好的答案。
如果你不能以其他方式处理异常,为什么记录异常并重新抛出它(当然要保留原始的堆栈跟踪)会是一个不好的想法?
我认为答案主要是因为,如果你无法处理它,为什么要捕获它呢?如果有人能够处理它(或者别无选择只能处理它),为什么不让他们记录下来,如果他们觉得值得记录的话?
如果你捕获异常并记录并重新抛出它,那么上游代码就无法知道你已经记录了异常,因此同样的异常可能会被记录两次。或者更糟的是,如果所有上游代码都遵循这个相同的模式,那么异常可能会被记录任意次数,每个决定捕获、记录和重新抛出它的代码层级都会记录一次。
还有一些人可能会认为,由于抛出和捕获异常是相对昂贵的操作,所有这些捕获和重新抛出操作并没有帮助您的运行时性能。它也没有帮助您的代码变得简洁或易于维护。
如果捕获并重新抛出异常的实体有理由认为该异常包含的信息不会在调用栈中进一步记录,除非以最理想的方式记录,那么log-and-throw是一个很好的模式。 以下是可能发生这种情况的几个原因:
我想最简单的原因是通常有一个顶级处理程序可以为您执行此操作,因此没有必要在代码中污染此异常处理。
交叉关注点的论点基本上是处理与您无关的错误是浪费时间。更好的做法是让错误向上调用栈冒泡,直到找到适当的处理程序为止。
在我看来,唯一应该捕获异常的时间是当您可以使用结果时。仅为记录而捕获是没有用的,因为您可以将其集中在更高层次。
IMO记录和抛出异常明显违反了最少惊讶原则。
如果异常在调用堆栈中的更高层面得到恰当处理,那么它可能根本不值得记录错误日志。然后再找到错误日志条目会变得令人困惑。