何时抛出异常?
何时抛出异常?
我为我的应用程序不期望发生的每个条件创建了异常。 UserNameNotValidException
,PasswordNotCorrectException
等等。
然而,有人告诉我不应为这些条件创建异常。在我的UML中,它们是主要流程的异常,那么为什么不应该是异常呢?
有关创建异常的指导或最佳做法吗?
admin 更改状态以发布 2023年5月20日
我的个人准则是:当当前代码块的基本假设被发现为假时,就会抛出异常。
例如,我有一个函数,它应该检查任意类并返回true,如果该类从List<>继承。这个函数问的问题是:“这个对象是List<>的后代吗?”这个函数永远不应该抛出异常,因为它的操作没有灰色地带——每个类都有自己的继承关系:要么继承自List<>,要么不是,因此答案总是“是”或“否”。
例如,我有另一个函数,它检查List<>并返回true,如果它的长度超过50,则返回false。这个函数问的问题是:“这个列表有50个以上的项吗?”但是这个问题做了一个假设——它假设它被给予的对象是一个列表。如果我把一个空值传递给它,那么这个假设就是假的。在那种情况下,如果函数返回true或false,那么它就违反了自己的规则。函数不能返回任何东西并声称它正确回答了问题。因此,它不返回,而是抛出异常。
这类似于“负载问题”逻辑谬误。每个函数都问一个问题。如果输入使得这个问题成为谬误,那么就抛出异常。对于返回void的函数,这条线很难画出,但最重要的是:如果函数对其输入的假设被违反,它应该抛出异常而不是正常地返回。
这个等式的另一面是:如果你发现你的函数经常抛出异常,那么你可能需要优化它们的假设。