2011-05-01 59 views
0

这是一个非常流行和众所周知的短语,您应该“只捕捉/抛出异常的例外”。但是,如何确定“例外”例外?Juding是否例外情况

例如,一个错误的密码在登录服务时非常例行,所以这并不例外。 Web应用程序的统计信息可能会显示类似于每5次尝试一次的错误登录尝试(从没有特定用户)。同样,在试图在网上商店购物篮结账时,这可能非常普遍(特别是对于新用户)。但是,没有找到的文件可能会发生任何变化。我通常按​​照以下方式工作:如果一个方法缺少某些工作来执行它的工作,则抛出一个异常,但是在这里它会有点混乱。在某些情况下,没有找到的文件可能很常见(例如,许多用户使用的文件共享没有严格的控制),而非锁定的生产环境缺少文件,这是非常特殊的。

这是正确的方式来推断异常是否例外吗?我可以很容易地过滤诸如没有网络连接之类的东西,但是有些情况很难判断。这是主观的吗?

感谢

+0

只是因为这很普遍,并不意味着它不应该引起异常。 – nos 2011-05-01 00:49:07

+0

这真的是一个众所周知的短语?这究竟意味着什么?你在哪里看到有人定义它?看起来你是在要求定义这个__ known_词组的意思,但我不认为它是众所周知的。我在谷歌搜索中找不到任何提及。 – Hogan 2011-05-01 00:52:18

+0

但是,如果你的问题真的是 - 我的代码何时不处理异常(即_throw_)。答案很简单:当一些事情发生时,你的代码无法从中恢复。 _当然,其他所有事情都有例外(双关语意思)这个规则_ – Hogan 2011-05-01 00:54:49

回答

1

我认为这是相当主观的,说实话,所以我更喜欢以避免搞清楚的时候,我应该使用异常的那个方法。

相反,我宁愿要考虑三件事情:

  1. 是不是有可能,我可能要让调用堆栈放松多个等级?
  2. 还有别的办法吗? (返回null或错误代码等)如果是这样,我是否有丝毫的性能问题?
  3. 如果这两者都不能做出明确的决定,那么需要维护代码的人更容易阅读这些决定?

如果#1为真,并且我没有主要的性能问题,我可能会选择使用异常,因为它会加快我的开发时间而不必编写返回码(并手动编码让他们在需要时传播调用堆栈的逻辑)。当您使用异常时,调用堆栈展开对于开发时间是免费的。

如果#2是真的,或者我不会超过一帧(也许两个?)调用堆栈或者我有一个严重的性能问题(例如,在一个紧密的循环中),那么我'我会努力寻找另一种不涉及例外的方式。

例外只是程序员使用支持它们的语言的工具。我不相信他们必须对什么是“特殊”与否有任何内在价值。相反,我说使用它们时,他们是最好的工具

+1

其他的考虑发生在诸如C++的语言中,比如如果选择使用异常,所有的代码必须是异常安全的,即必须正确释放资源。 – 2011-05-01 00:59:16

+0

好的思维方式。 “让调用堆栈放松多个级别”是什么意思? – dotnetdev 2011-05-01 00:59:18

+0

@dotnetdev:如果你想在几个层次上捕捉异常(即,你不想在异常代码的相同函数中捕捉异常)。异常会自动返回调用堆栈,以与调用方式相反的顺序丢弃函数上下文。如果你想使用返回码,你必须在EACH中间函数级别有处理逻辑,例如'if(errorCode!= SUCCESS)返回errorCode;',有时这可能是写十次的痛苦。 – 2011-05-12 16:21:14