假设您有一个具有一些前置条件和后置条件的方法。 是否可以为每个未完成的前置条件创建异常类? 例如: 未完成pre1意味着抛出notPre1Exception实例。
答案 0 :(得分:9)
为什么不想定义PreconditionFailedException(字符串前置条件)?为每个失败的前置条件抛出不同的异常类型是过度的。
答案 1 :(得分:3)
是和否。
是 - 违反先决条件肯定是抛出异常的适当时机。抛出一个更具体的异常会使捕获该特定异常变得更简单。
否 - 为程序/ api中的每个前置条件声明一个新的异常类似乎有点矫枉过正。这最终可能导致数百或数千个异常。这在思想上和计算上都是浪费。
我建议为违反前提条件抛出异常。但是,我不建议为每个前提条件定义一个新的例外。相反,我建议创建更广泛的异常类,涵盖特定的类型的前提条件违规,而不是特定的前提条件违规。 (我还建议在适合的情况下使用现有的例外情况。)
答案 2 :(得分:2)
失败的前提条件应抛出AssertException或类似的东西。在调用方法之前,必须先保留前提条件。如果调用者没有进行此检查,则是程序中的错误或方法(API)的错误使用。
答案 3 :(得分:1)
只有在没有完成前提条件的情况下才会发生罕见的异常事件。
答案 4 :(得分:1)
听起来像对我有用的例外。它当然允许更细粒度的日志记录和调试,而不仅仅是一般的“前置条件失败”,尽管你也可能只有一个“前置条件失败”异常,并将失败的前置条件放入异常消息中。
答案 5 :(得分:1)
我认为只要您计划使用和处理它们,就可以为所有例外创建一个不同的例外。
我发现错误/异常处理越好,在后期调试软件就越容易。
例如:如果你有一个通用的excpeiton来处理所有错误输入,那么你必须查看在发生错误时传递给方法的所有内容。如果你对所有类型的恶劣条件都有所了解,那么你就会知道在哪里看。
答案 6 :(得分:1)
对我来说看起来很可能,但是如果你想继续这种处理前置条件的方式,那么每个类方法最终会得到N个异常类。看起来像是“非功能”阶级的爆炸性增长。
我总是喜欢代码,其中'核心'功能没有处理违反前提条件(除了断言它们 - 一个很大的帮助!)。然后可以将此代码包装在“precondition-checker”中, 会抛出异常或以其他方式通知不满意。
答案 7 :(得分:1)
作为一种非常通用的方法来确定你是否应该创建一个类(并且一个例外是一个类),你应该确定是否有一些代码使这个类与所有其他类都是唯一的(在这种情况下)例外)。
如果没有,我只是在异常中设置字符串并将其称为一天。如果您在异常中执行代码(可能是通过调用exception.resolve()或其他东西可以处理多种情况的通用恢复机制),那么它可能很有用。
我意识到异常并不总是遵循这个规则,但我认为这或多或少是因为语言提供的异常不能在其中包含任何业务逻辑(因为他们不了解业务 - 库总是如此往往充满了OO规则的例外情况)
答案 8 :(得分:1)
我认为Ben在这里的目标。如果你不打算抓住它们,抛出不同的例外是什么意思?如果你真的想要抛弃另一个,我至少会有一个共同的“PreconditionFailedException”基类,它们都是从它们派生出来的,并尝试将它们组织成某种类型的heirachy,这样你就可以捕获它们的组。就个人而言,我没有不同的东西,只是你会抛出一个常见的例外,每一个都有失败的细节。
答案 9 :(得分:1)
不,您不应为每个前提条件创建特定的例外,因为它违反了“按合同设计”的原则。
实现前置条件的推论是它们应该是文档的一部分,并且您应该为调用者提供必要的方法来检查所有前提条件是否有效。 (即,如果方法执行依赖于对象的状态,则调用者应该可以使用检查状态的方法。)
因此,调用者应该能够在调用方法之前检查是否满足所有先决条件。
为每个违反的前提条件实现特定的例外会/可能会鼓励调用者在方法调用周围使用try / catch模式,这与契约设计的哲学相矛盾。
答案 10 :(得分:0)
我想说只要你让它们成为未经检查的异常(Java中的RuntimeException的子类)就可以了。但是,在Java中,最好只使用断言。
答案 11 :(得分:0)
如果这样做,请确保它们都继承自另一个常见的自定义异常。