【问题标题】:How do I distinguish between a truly exceptional circumstances and a routine bad condition?我如何区分真正的特殊情况和常规的不良情况?
【发布时间】:2008-12-17 00:45:44
【问题描述】:

许多开发人员说只有在真正异常的情况下才抛出异常。其中之一是如果我要写入的外部硬盘驱动器未打开(因此不是连接/注册的驱动器)。但是,有些情况很难判断它们是否真的异常。

例如,为文件夹路径输入字符串但未找到。在这种情况下,如果有任何输入无法找到(例如集合中的名称未找到),是否最好只返回错误消息和一些操作?

例如

public void Find(string name)
{
    if(Names.contains(name)
    {
        string s = Names.get(name);
    }

    if(!Names.contains(string name)
    {
        throw new ???Exception;
    }
}

或者做一些类似显示弹出窗口并优雅地处理情况的事情?

在 else 或 if 语句中抛出异常是否明智?查看有关异常处理的代码异味列表会对我有很大帮助。

【问题讨论】:

    标签: exception


    【解决方案1】:

    一般来说,它是这样工作的:

    如果您可以不受干扰地处理这种情况,请这样做。 (文件不存在,但其输入对于继续操作不是必需的[首选项、可选配置等])

    如果您需要用户干预,请询问他们。 (文件不存在,但您需要它才能继续操作)

    如果是用户无法解决的问题(内存不足、硬件故障等),则抛出异常。

    每个地方对细节都有自己的标准,但我发现上面的方法一般都可以。

    【讨论】:

      【解决方案2】:
      1. 如果您的代码可以从异常中恢复,请这样做
      2. 如果要求客户检查返回值是否存在预期的轻微异常是可以接受的,那么就这样做 - 这是一个判断调用,见下文
      3. 在所有其他情况下,抛出异常(或不捕获被调用方法的异常)

      对于第二种情况,minor 和 expected 是高度上下文相关的

      恕我直言,不要将异常用于控制流,但在所有其他情况下,你可能会更安全地抛出它们

      请注意,一些“优化”建议会告诉您检查条件而不是依赖异常,例如file-not-found,但实际上您仍然应该期待异常,因为文件可能会在检查存在的语句和尝试打开文件的语句之间被删除或移动!

      总结:一般来说,抛出异常是最安全的做法。当然,直接警告或询问用户应该在用户界面代码中完成!

      【讨论】:

        【解决方案3】:

        如果有什么可以做的,应该使用异常,但是检测到它的代码不知道该怎么做。

        【讨论】:

          猜你喜欢
          • 2016-10-23
          • 1970-01-01
          • 1970-01-01
          • 2016-12-28
          • 2012-07-13
          • 1970-01-01
          • 2013-10-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多