Language agnostic 先决条件和例外

Language agnostic 先决条件和例外,language-agnostic,exception,preconditions,Language Agnostic,Exception,Preconditions,假设您有一个带有一些前置和后置条件的方法。 为每个未完成的前提条件创建一个异常类可以吗? 例如: 不完成pre1意味着抛出notPre1Exception实例。只有在不完成前提条件时才会出现罕见的异常情况。对我来说,这听起来像是异常的有用用法。它当然允许比一般的“前置条件失败”更细粒度的日志记录和调试,尽管您也可以有一个“前置条件失败”异常,并将哪些前置条件失败放入异常消息中。为什么不想定义PremissionFailedException(字符串前置条件)?为每个失败的前提条件抛出不同的异常类

假设您有一个带有一些前置和后置条件的方法。 为每个未完成的前提条件创建一个异常类可以吗? 例如:
不完成pre1意味着抛出notPre1Exception实例。

只有在不完成前提条件时才会出现罕见的异常情况。

对我来说,这听起来像是异常的有用用法。它当然允许比一般的“前置条件失败”更细粒度的日志记录和调试,尽管您也可以有一个“前置条件失败”异常,并将哪些前置条件失败放入异常消息中。

为什么不想定义PremissionFailedException(字符串前置条件)?为每个失败的前提条件抛出不同的异常类型是过分的。

我认为为所有异常创建不同的异常是可以的,只要您计划使用和处理它们

我发现错误/异常处理得越好,就越容易在后期调试软件


例如:如果您有一个通用的excpeiton来处理所有错误的输入,那么如果有错误,您必须查看传递到该方法中的所有内容。如果你对所有类型的坏条件都有一个例外,你会很清楚地知道去哪里寻找。

在我看来这是可能的,但是如果你想继续用这种方式处理前提条件,你会发现每个类方法有N个异常类。看起来“非功能”类的爆炸性增长


我一直喜欢“核心”功能不处理违反先决条件的代码(除了断言它们——这是一个很大的帮助!)。然后,可以将此代码包装在“前提条件检查器”中,该检查器会抛出异常或以其他方式通知不满意情况。

作为确定是否应该创建类(异常是一个类)的一种非常通用的方法,您应该确定是否有某些代码使该类与所有其他类唯一(在本例中为例外情况)

如果不是,我只需要在异常中设置字符串并在一天内调用它。如果您在异常中执行代码(可能是一种通过调用exception.resolve()或其他方法可以处理多种情况的通用恢复机制),那么它可能会很有用


我意识到异常并不总是遵循这个规则,但我认为这或多或少是因为语言提供的异常中没有任何业务逻辑(因为它们不知道业务——库中总是充满了OO规则的异常)

一个失败的前提条件应该抛出一个AssertException,或类似的东西。在调用一个方法之前,它的前提条件必须保持不变。如果调用方不做这个检查,这是程序中的一个错误,或者方法(API)的使用不正确。

我想说,只要将它们设置为未经检查的异常就可以了(Java中RuntimeException的子类)。但是,在Java中,最好只使用断言。

是和否

是-违反先决条件当然是抛出异常的适当时机。抛出更具体的异常将使捕获该特定异常变得更简单

否-为程序/api中的每个先决条件声明一个新的异常类似乎有些过分。这最终可能导致数百或数千个异常。这在思想上和计算上都是一种浪费


我建议为违反先决条件的情况抛出异常。但是,我不建议为每个先决条件定义新的异常。相反,我建议创建更广泛的异常类,涵盖特定类型的先决条件违反,而不是特定的先决条件违反。(我还建议在合适的地方使用现有的异常。)

我认为Ben在这方面的目标是正确的。如果你不打算捕获它们,抛出不同的异常有什么意义?如果你真的想抛出不同的异常,我至少会有一个常见的“PredicateFailedException”它们都是从基类派生的,并尝试将它们组织成某种继承方式,以便您可以捕获它们的组。就个人而言,我不会有不同的组,只会有一个您抛出的常见异常,每个异常中都有失败的细节。

如果这样做,请确保它们都从另一个常见的自定义异常继承。

否,您不应该为每个先决条件创建特定的例外,因为这将违反合同设计的原则

实现前置条件的必然结果是,它们应该是文档的一部分,并且您应该为调用者提供必要的方法来检查所有的前置条件是否有效(即,如果方法的执行依赖于对象的状态,那么检查状态的方法应该对调用者可用)

因此,调用方应该能够在调用方法之前检查是否满足所有先决条件


为每个违反的前提条件实现特定的异常会/可能会鼓励调用方在方法调用周围使用try/catch模式,这与契约式设计的理念相矛盾。

此外,您的通用前提条件异常类型可以采用参数(例如,字符串或枚举)这仍然允许您轻松地准确设置失败的条件。