【问题标题】:exception bubbling pattern in javajava中的异常冒泡模式
【发布时间】:2015-09-23 12:21:54
【问题描述】:

假设我的应用程序代码是结构是层。

例如
第一层是客户服务层。
二是验证层
第三是自定义业务逻辑层。 四是核心业务逻辑层。
五是ORM层。

如果我们发现用户发出的请求无法被配置(可能是由于缺少所需的数据或任何其他应用程序逻辑约束),我们希望在应用程序代码的任何点/级别都这样做,并且我们希望抛出错误,这应该不被除顶层之外的任何其他层捕获,以便错误消息可以正确显示给用户。

为了实现这一点,我正在考虑创建一个扩展 Error 的新类。 这样它就不会被选中,并且可以跳过任何捕获异常的try catch block

这看起来像一个好策略吗?当我的解决方案与 javadoc 相悖时,是否有一个 bttern 模式?

Javadoc 解释得很好:

错误是 Throwable 的子类,表示存在严重问题 一个合理的应用程序不应该试图捕捉。大多数这样的 错误是异常情况。

【问题讨论】:

    标签: java design-patterns error-handling exception-handling


    【解决方案1】:

    如果你真的不想让你的所有方法都抛出相同的基本异常,你可以让你的异常扩展 RuntimeException 它不会被检查。

    你永远不应该捕获错误。 除非您希望程序立即停止并显示紧急消息,否则您永远不应该扩展 Error。

    【讨论】:

      【解决方案2】:

      不,这是一个糟糕的策略。一般来说,你几乎不应该扩展Error。扩展Exception(用于检查的异常)或RuntimeException(用于未检查的异常)。从较低级别抛出异常以绕过中间 try-catch 块的想法也很糟糕。中间的 try-catch 块设计来捕获并可能重新抛出异常,将它们包装在更多面向业务的异常对象中。如果您对中间层的逻辑不满意,请更改该逻辑,不要尝试破解它。

      【讨论】:

      • “如果你对中间层的逻辑不满意,那就改变那个逻辑,不要试图破解它。”这将引发代码库的巨大变化,因为大多数尝试捕获模式捕获(异常 e)...
      • @user2410148 有关一些想法,请参阅此答案。 stackoverflow.com/a/14722976/1168342该模式被称为“转换异常”c2.com/cgi/wiki?ConvertExceptions
      【解决方案3】:

      您可以在较低层中声明方法以抛出异常而不是捕获它们:

      public businessLayerFoo() throws Exception {
         ...
      }
      

      Error 通常用于表示执行过程中出现了严重问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2011-05-13
        • 2015-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多