小编典典

什么时候抛出异常?

all

我为我的应用程序不期望的每个条件创建了异常。
UserNameNotValidExceptionPasswordNotCorrectException

但是我被告知我不应该为这些条件创建例外。在我的 UML 中,那些是主要流程的异常,那么为什么它不应该是异常呢?

创建例外的任何指导或最佳实践?


阅读 107

收藏
2022-03-14

共1个答案

小编典典

我个人的指导方针是:当发现当前代码块的基本假设不正确时,将引发异常。

示例 1:假设我有一个函数应该检查任意类并在该类继承自 List<> 时返回 true。这个函数提出了一个问题,“这个对象是 List 的后代吗?”
这个函数不应该抛出异常,因为在它的操作中没有灰色区域——每个单独的类要么继承自 List<>,要么不继承,所以答案总是“是”或“否”。

示例 2:假设我有另一个函数检查 List<> 并在其长度大于 50 时返回 true,如果长度小于则返回
false。这个函数提出了一个问题,“这个列表有超过 50 个项目吗?”
但是这个问题做了一个假设——它假设给出的对象是一个列表。如果我给它一个NULL,那么这个假设是错误的。在这种情况下,如果函数返回 true
false ,那么它就违反了自己的规则。该函数不能返回 任何内容 并声称它正确回答了问题。所以它不会返回 - 它会引发异常。

这与“加载问题”的逻辑谬误相当。每个函数都会提出一个问题。如果给出的输入使该问题成为谬误,则抛出异常。使用返回
void 的函数很难画出这条线,但底线是:如果违反了函数对其输入的假设,它应该抛出异常而不是正常返回。

这个等式的另一面是:如果你发现你的函数经常抛出异常,那么你可能需要改进它们的假设。

2022-03-14