【发布时间】:2020-02-11 13:39:47
【问题描述】:
我有一个关于捕获异常的问题。我在后端有不同的层,例如存储库、数据处理、控制器三层。我想知道存储库层是否抛出异常,我应该在存储库层捕获它还是在控制器层甚至控制器顶部的路由层捕获它。 有人建议在一层捕获所有异常,看起来它简化了处理。但我从其他人那里听说,最好尽早发现异常。
请留下您的意见。非常感谢。
【问题讨论】:
标签: exception
我有一个关于捕获异常的问题。我在后端有不同的层,例如存储库、数据处理、控制器三层。我想知道存储库层是否抛出异常,我应该在存储库层捕获它还是在控制器层甚至控制器顶部的路由层捕获它。 有人建议在一层捕获所有异常,看起来它简化了处理。但我从其他人那里听说,最好尽早发现异常。
请留下您的意见。非常感谢。
【问题讨论】:
标签: exception
通常,只要您可以有意义地做某事,您就会捕获异常。您是否可以有意义地处理它并继续使用应用程序,或者您是否只想记录它并重新抛出,或者向它添加信息并重新抛出等等。
有人建议在一层捕获所有异常
没有一个地方总是能够有意义地处理所有可能的错误。例如,考虑用户上传要以某种方式进行批处理的记录电子表格的场景。每条记录都需要单独处理,系统只需循环遍历它们。如果其中一条记录因异常而失败,该怎么办?
这取决于系统的需求。考虑两个不同的要求:
或者:
在其中一种情况下,捕获和处理循环内的异常而不让控制流离开该循环是有意义的。在另一种情况下,在包装整个流程的工作单元级别捕获异常并相应地提交或回滚整个操作是有意义的。这些可能是代码中截然不同的部分/层。
如果您可以或应该对代码的某个部分的异常进行处理,请捕获该异常并执行该任务。如果没有,让异常继续向上堆栈,直到它到达可以以某种方式响应它的东西。
在许多情况下(但肯定不是所有情况的通用规则),您通常需要一个全局顶级异常处理程序来防止应用程序本身失败。理想情况下,大多数异常永远不会到达该顶级处理程序,因为它基本上是一个包罗万象的信息,表明某些意外失败并且应用程序中的任何代码都无法有意义地处理该失败。
【讨论】: