我为我的应用程序不期望的每个条件创建了异常。 UserNameNotValidException等PasswordNotCorrectException。
UserNameNotValidException
PasswordNotCorrectException
但是我被告知我不应该为这些条件创建例外。在我的 UML 中,那些是主要流程的异常,那么为什么它不应该是异常呢?
创建例外的任何指导或最佳实践?
我个人的指导方针是:当发现当前代码块的基本假设不正确时,将引发异常。
示例 1:假设我有一个函数应该检查任意类并在该类继承自 List<> 时返回 true。这个函数提出了一个问题,“这个对象是 List 的后代吗?” 这个函数不应该抛出异常,因为在它的操作中没有灰色区域——每个单独的类要么继承自 List<>,要么不继承,所以答案总是“是”或“否”。
示例 2:假设我有另一个函数检查 List<> 并在其长度大于 50 时返回 true,如果长度小于则返回 false。这个函数提出了一个问题,“这个列表有超过 50 个项目吗?” 但是这个问题做了一个假设——它假设给出的对象是一个列表。如果我给它一个NULL,那么这个假设是错误的。在这种情况下,如果函数返回 true 或 false ,那么它就违反了自己的规则。该函数不能返回 任何内容 并声称它正确回答了问题。所以它不会返回 - 它会引发异常。
这与“加载问题”的逻辑谬误相当。每个函数都会提出一个问题。如果给出的输入使该问题成为谬误,则抛出异常。使用返回 void 的函数很难画出这条线,但底线是:如果违反了函数对其输入的假设,它应该抛出异常而不是正常返回。
这个等式的另一面是:如果你发现你的函数经常抛出异常,那么你可能需要改进它们的假设。