何时抛出异常?

6 浏览
0 Comments

何时抛出异常?

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

然而,有人告诉我不应为这些条件创建异常。在我的UML中,它们是主要流程的异常,那么为什么不应该是异常呢?

有关创建异常的指导或最佳做法吗?

admin 更改状态以发布 2023年5月20日
0
0 Comments

因为它们是通常会发生的事情。例外不是控制流机制。用户通常会输错密码,这并不是异常情况。异常应该是真正罕见的事情,比如UserHasDiedAtKeyboard这样的情况。

0
0 Comments

我的个人准则是:当当前代码块的基本假设被发现为假时,就会抛出异常。

例如,我有一个函数,它应该检查任意类并返回true,如果该类从List<>继承。这个函数问的问题是:“这个对象是List<>的后代吗?”这个函数永远不应该抛出异常,因为它的操作没有灰色地带——每个类都有自己的继承关系:要么继承自List<>,要么不是,因此答案总是“是”或“否”。

例如,我有另一个函数,它检查List<>并返回true,如果它的长度超过50,则返回false。这个函数问的问题是:“这个列表有50个以上的项吗?”但是这个问题做了一个假设——它假设它被给予的对象是一个列表。如果我把一个空值传递给它,那么这个假设就是假的。在那种情况下,如果函数返回true或false,那么它就违反了自己的规则。函数不能返回任何东西并声称它正确回答了问题。因此,它不返回,而是抛出异常。

这类似于“负载问题”逻辑谬误。每个函数都问一个问题。如果输入使得这个问题成为谬误,那么就抛出异常。对于返回void的函数,这条线很难画出,但最重要的是:如果函数对其输入的假设被违反,它应该抛出异常而不是正常地返回。

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

0