Exception 判断例外情况是否例外

Exception 判断例外情况是否例外,exception,exception-handling,Exception,Exception Handling,这是一个非常流行且众所周知的短语,您应该“只捕获/抛出异常”。然而,如何确定“例外”例外 例如,坏密码在登录服务时非常常见,因此这并不例外。web应用的统计数据可能会显示每5次登录尝试中就有一次登录失败(没有特定用户)。类似地,在网上商店尝试带着购物篮去结账时,这可能非常常见(特别是对于新用户)。但是,找不到的文件可能会出现两种情况。我通常的工作思路是,如果一个方法缺少一些东西来完成它的工作,抛出一个异常,但是在这里它会变得有点混乱。在某些情况下,找不到的文件可能很常见(例如,许多用户使用的文件

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

例如,坏密码在登录服务时非常常见,因此这并不例外。web应用的统计数据可能会显示每5次登录尝试中就有一次登录失败(没有特定用户)。类似地,在网上商店尝试带着购物篮去结账时,这可能非常常见(特别是对于新用户)。但是,找不到的文件可能会出现两种情况。我通常的工作思路是,如果一个方法缺少一些东西来完成它的工作,抛出一个异常,但是在这里它会变得有点混乱。在某些情况下,找不到的文件可能很常见(例如,许多用户使用的文件共享没有严格的控制),而非常封闭的生产环境缺少一个文件则是例外

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


谢谢

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

我宁愿考虑三件事:

  • 我是否可能希望让调用堆栈展开多个级别
  • 还有别的办法吗?(返回null或错误代码等)如果是,我是否有哪怕是最轻微的性能问题
  • 如果这两个都不能导致一个明确的决定,那么维护代码的人更容易阅读哪一个
  • 如果#1为真,并且我没有主要的性能问题,我可能会选择使用异常,因为它将加快我的开发时间,而不必编写返回代码(如果需要,手动编写逻辑以使它们传播到调用堆栈)。使用异常时,调用堆栈展开在开发时是免费的

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


    异常只是程序员使用的一种支持异常的语言工具。我不相信他们有任何内在的价值,关于什么是“例外”与否。相反,我说当它们是工作的最佳工具时使用它们

    仅仅因为它很常见,并不意味着它不应该导致例外。这真的是一个众所周知的短语吗?这到底是什么意思?你在哪里看到有人给它下定义的?你似乎在问这个众所周知的短语是什么意思,但我认为它并不广为人知。我在谷歌搜索中找不到任何关于它的内容。然而,如果你的问题是——我的代码什么时候不应该处理异常(即抛出)。答案很简单:当代码无法恢复时。当然,和其他所有事物一样,对于这个规则也有例外(双关语),其他的考虑在诸如C++之类的语言中发生,例如如果选择使用异常,则所有代码必须是异常安全的,即必须正确地释放资源。您所说的“让调用堆栈展开多个级别”是什么意思?@dotnetdev:如果您想捕获上几级的异常(即,您不想在调用异常代码的同一个函数中捕获异常)。异常将自然地返回调用堆栈,以与调用顺序相反的顺序丢弃函数上下文。如果要使用返回代码,必须在每个干预功能级别中具有处理逻辑,例如,
    If(errorCode!=SUCCESS)返回errorCode,有时写十遍会很痛苦。我明白了。所以你只是让异常继续发展。