Exception 何时抛出异常?

Exception 何时抛出异常?,exception,conventions,Exception,Conventions,例外是美妙的事情,但我有时担心我扔太多了。考虑这个例子: 类用户{ public function User(user){ // Query database for user data if(!user) throw new ExistenceException('User not found'); } } 我认为简单地返回false(或者在本例中将所有用户数据设置为false)比抛出异常更有意义 您更喜欢哪一种?我通常会使用异常作为最后的手段。如果它是应该

例外是美妙的事情,但我有时担心我扔太多了。考虑这个例子:

类用户{

  public function User(user){
  
    // Query database for user data

    if(!user) throw new ExistenceException('User not found');

  }
}

我认为简单地返回false(或者在本例中将所有用户数据设置为false)比抛出异常更有意义


您更喜欢哪一种?

我通常会使用异常作为最后的手段。如果它是应该永远不会发生的事情,并且语言支持它,我将使用某种断言(因为它的发生肯定是某种bug)

如果可以避免,我宁愿使用错误代码。

当然,在某些语言中,有些情况下你别无选择。例如,C++构造函数可以没有返回值,而有一个部分构造的对象可能是不好的,因此抛出异常有时是最好的选择。
总而言之,如果您可以测试错误条件,并简单地以非基于异常的方式向调用方报告错误,我更愿意这样做。

在异常情况下抛出异常

如果该情况是程序正常运行时的预期情况,请检查并报告错误。为不应该发生的事情保留异常,或者向其他程序员表明发生了无法恢复的事情


在您的情况下,返回
false
更有意义(或者使用a作为返回值)。

以下是我的经验法则

  • 正常程序逻辑-使用返回代码和参数
  • 发生了一些不寻常的事情-使用异常

当服务器或其他预期的硬件或资源不可用时,就会出现异常情况。当出现异常时,您希望开发人员或一线支持人员发出警报,指出某些问题需要解决。

当发生非常糟糕的问题时使用异常。通常,当出现不可恢复的错误时,您希望抛出异常,该错误会使代码的状态处于不一致的状态。有时,当构造函数被传递了一个无效参数(IllegalArgumentException)时,您还希望抛出一个异常来停止对象的创建。这些都是例外情况


正如其他评论所说,谨慎使用例外,并将其作为最后手段。在Java中,抛出异常会暂停JVM,因此您不想使用它进行正常的错误处理,因为它会大大降低应用程序的性能。

我从阅读“学习Python”中得到了这样的印象至少该语言是真正“异常友好的”:作者建议对某些类型的控制流使用异常(事实上,许多像EOF这样的“错误”都是引发的异常)。那么,这取决于语言吗?@阿德里亚诺:观察得很好。在某种程度上,我认为是的。看起来在这个问题上有一些相反的答案,那么,如果您需要了解失败的原因(登录未找到/密码不正确/…),您会怎么做?不鼓励使用错误代码:因此,您回到异常处理,而不是针对异常情况?@Guillaume86-与编程中的许多其他事情一样,这是关于平衡的。我认为,如果您预期会发生错误,那么在异常发生时就不应该抛出异常。同时,您应该构造代码,使其不依赖于返回的错误代码-您如何做到这一点?好问题,这取决于应用程序、体系结构和预期行为。