【问题标题】:when to catch exception, early or later?什么时候捕捉异常,早点还是晚点?
【发布时间】:2020-02-11 13:39:47
【问题描述】:

我有一个关于捕获异常的问题。我在后端有不同的层,例如存储库、数据处理、控制器三层。我想知道存储库层是否抛出异常,我应该在存储库层捕获它还是在控制器层甚至控制器顶部的路由层捕获它。 有人建议在一层捕获所有异常,看起来它简化了处理。但我从其他人那里听说,最好尽早发现异常。

请留下您的意见。非常感谢。

【问题讨论】:

    标签: exception


    【解决方案1】:

    通常,只要您可以有意义地做某事,您就会捕获异常。您是否可以有意义地处理它并继续使用应用程序,或者您是否只想记录它并重新抛出,或者向它添加信息并重新抛出等等。

    有人建议在一层捕获所有异常

    没有一个地方总是能够有意义地处理所有可能的错误。例如,考虑用户上传要以某种方式进行批处理的记录电子表格的场景。每条记录都需要单独处理,系统只需循环遍历它们。如果其中一条记录因异常而失败,该怎么办?

    这取决于系统的需求。考虑两个不同的要求:

    • 如果单个记录失败,请将其存储在某处失败但继续处理其余记录。批处理完成后,向用户发送失败记录报告。

    或者:

    • 如果单个记录失败,则回滚整个批次并通知用户该批次已损坏,并指出导致问题的记录。

    在其中一种情况下,捕获和处理循环内的异常而不让控制流离开该循环是有意义的。在另一种情况下,在包装整个流程的工作单元级别捕获异常并相应地提交或回滚整个操作是有意义的。这些可能是代码中截然不同的部分/层。


    如果您可以或应该对代码的某个部分的异常进行处理,请捕获该异常并执行该任务。如果没有,让异常继续向上堆栈,直到它到达可以以某种方式响应它的东西。

    在许多情况下(但肯定不是所有情况的通用规则),您通常需要一个全局顶级异常处理程序来防止应用程序本身失败。理想情况下,大多数异常永远不会到达该顶级处理程序,因为它基本上是一个包罗万象的信息,表明某些意外失败并且应用程序中的任何代码都无法有意义地处理该失败。

    【讨论】:

    • 嗨大卫,感谢您的回复。它非常清楚并且有很大帮助。顺便说一句,如果我想记录错误并在某些层中重新抛出,如何避免在这些层中重复记录?
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2013-08-14
    • 2012-01-10
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    相关资源
    最近更新 更多