【问题标题】:Juding whether an exception is exceptional判断异常是否异常
【发布时间】:2011-05-01 00:45:04
【问题描述】:

这是一个非常流行且众所周知的短语,您应该“只捕获/抛出异常的异常”。但是,“异常”异常是如何确定的呢?

例如,错误的密码在登录服务时非常常见,所以这并不例外。 Web 应用程序的统计数据可能会显示每 5 次尝试(来自没有特定用户)的错误登录尝试。同样,尝试在网上商店带着购物篮结账时,这可能很常见(尤其是对于新用户)。但是,未找到的文件可能会以任何一种方式进行。我通常按​​照这样的思路工作,如果一个方法缺少一些东西来完成它的工作,抛出一个异常,但是在这里它会变得有点混乱。在某些情况下,找不到文件可能很常见(例如,许多用户使用的文件共享没有严格控制),而在非常锁定的生产环境中缺少文件,这将是例外。

这是推断异常是否异常的正确方法吗?我可以轻松地将无网络连接等情况过滤为异常,但有些情况很难判断。是主观的吗?

谢谢

【问题讨论】:

  • 普通不代表不应该引发异常。
  • 这真的是一个众所周知的短语吗?它到底是什么意思?你在哪里看到有人定义它?您似乎要求定义这个 well known 短语的含义,但我认为它并不为人所知。我在谷歌搜索中找不到任何提及它。
  • 但是,如果您的问题确实是——我的代码何时不应该处理异常(即 throw)。答案很简单:当发生您的代码无法恢复的事情时。 当然,和其他一切一样,这条规则也有例外(双关语)

标签: exception exception-handling


【解决方案1】:

老实说,我认为这是相当主观的,所以我宁愿避免那种确定何时应该使用异常的方法。

相反,我更愿意考虑三件事:

  1. 我是否可能希望让调用堆栈展开不止一层?
  2. 还有其他方法吗? (返回 null 或错误代码等)如果是,我是否有丝毫性能问题?
  3. 如果这些都没有导致明确的决定,那么需要维护代码的人更容易阅读哪个?

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

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

异常只是支持它们的语言的程序员的工具。我不相信他们必须有任何内在价值来判断什么是“例外”。相反,我说在它们是完成工作的最佳工具时使用它们

【讨论】:

  • C++ 等语言中还有其他一些注意事项,例如如果选择使用异常,所有代码都必须是异常安全的,即必须正确释放资源。
  • 很好的思维方式。 “让调用堆栈展开不止一层”是什么意思?
  • @dotnetdev:如果您想在更高级别捕获异常(即,您不想在调用异常代码的同一函数中捕获异常)。异常自然会返回调用堆栈,以与调用方式相反的顺序丢弃函数上下文。如果你想使用返回码,你必须在每个中间函数级别都有处理逻辑,例如,if (errorCode != SUCCESS) return errorCode;,有时写十次会很痛苦。
  • 我明白了。所以你只是让异常传播。
猜你喜欢
  • 2012-09-10
  • 2021-06-02
  • 2010-10-30
  • 1970-01-01
  • 2012-05-30
  • 2018-12-17
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
相关资源
最近更新 更多