2010-03-31 111 views
2

例外是美妙的事情,但我有时担心我扔太多。考虑下面这个例子:何时抛出异常?

类用户{

public function User(user){ 

    // Query database for user data 

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

    } 

}

我认为它使多大意义简单地返回false(或设置所有用户数据为false这种情况),而不是抛出异常。

你更喜欢哪一种?

+1

我从阅读“学习Python”得到的印象是,至少这种语言真的是'非常友好':作者推荐使用某些控制流的异常(事实上,许多'错误'如EOF引发异常)。那么,它依赖于语言吗? – 2010-03-31 18:09:50

+0

@Adriano:观察得很好。在某种程度上,我认为它确实如此。 – 2010-03-31 18:13:01

回答

4

在特殊情况下抛出异常。

如果在正常运行该程序时您所期望的情况,请检查并报告错误。对于永远不会发生的事情保留例外,或者作为其他程序员发现某些不可恢复事件已经发生的指示。

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

+0

看起来SO上的主题存在一些相反的答案,如果您需要获取失败原因(登录未找到/密码错误/ ...),您将如何处理?不鼓励使用错误代码:http://stackoverflow.com/questions/4044995/equivalent-to-windows-error-codes-in-net所以你回到异常处理,它不是在特殊情况下? – Guillaume86 2012-02-20 17:31:13

+1

@ Guillaume86 - 与编程中的许多其他事情一样,它关乎平衡。我会争辩说,如果你预计会发生错误,那么当它们发生时你不应该抛出异常。同时,你应该构建你的代码,因此它不依赖于返回的错误代码 - 你是如何做到的?好问题,这取决于应用程序,体系结构和预期行为。 – Oded 2012-02-20 19:16:28

+0

感谢您的回答 – Guillaume86 2012-02-21 09:14:18

1

我通常会使用异常作为最后的手段。如果它应该是从来没有发生,并且语言支持它,我会使用某种类型的断言(因为它发生肯定是某种类型的错误)。

如果可以避免,我会更喜欢错误代码。

当然在某些语言中有些情况下您没有多少选择。例如,C++构造函数可能没有返回值,并且可能不好使用部分构造的对象,所以抛出异常有时是最好的选择。总而言之,如果您可以测试错误情况,并以非基于异常的方式向调用方报告错误,那么我更喜欢这一点。

1

这里是我的拇指

  • 正常程序逻辑的规则 - 使用返回代码和参数
  • 发生了异常的发生 - 使用异常。

不寻常的是当服务器或其他预期的硬件或资源不可用时。发生异常时,您希望开发人员或第一线支持人员提醒您需要解决某些问题。

1

使用异常时真的很差意外发生。一般来说,当您有一个不可恢复的错误可能会使代码的状态处于不一致的状态时,您想要抛出异常。有时你也想抛出一个异常来在构造函数传递一个无效参数(IllegalArgumentException)时停止创建一个对象。这些都是特例。

正如其他意见所述,谨慎使用例外,并作为最后的手段。在Java中,抛出异常会暂停JVM,因此您不希望用于正常的错误处理,因为它会大大降低应用程序的性能。