为什么有些人在抛出异常后返回?

时间:2012-07-18 18:07:54

标签: php exception

我在Github的一些代码中看到了

if($something_funky_happens){
  throw new \LogicException(...);
  return;
}

这是必需的,还是不重要的? 因为我知道在你抛出异常后脚本停止了,所以进一步的代码不会运行

4 个答案:

答案 0 :(得分:28)

无法访问的代码

我倾向于在代码中表示错误。该声明无法访问。每个静态代码anaylsis工具都会抱怨这个无法访问的语句。即使在这种情况下没有任何危害,在检查代码时也会收到大量警告。如果关闭这些警告类型,您可能会错过代码中的其他逻辑错误。这是一种真正难闻的气味,需要修复。

答案 1 :(得分:4)

因为他们犯了错误,或者这是他们的个人偏好。在该代码中找到return是不可能的,但包含它并没有真正的危害。

来自the docs (强调我的)

  

当抛出异常时,语句后面的代码将不会执行,PHP将尝试查找第一个匹配的catch块。

答案 2 :(得分:4)

我想这只是为了更好的可读性....所以你可以更快地扫描出口点的代码,如果你假装每个出口点都被一个新的行分隔。

答案 3 :(得分:2)

我觉得这个惯例很有用,因为在尝试阅读现有代码时,提前退出会破坏对代码流的期望。并且经常值得被标示。这几乎是一个转到。

我从最外面的块读取到最里面,而不是顺序,所以埋在块内的任何东西看起来都不那么重要了。

比较

function doStuff {
  if (Y) {
    ##
    ## Stuff happens
    ##
  }
  else {
    ##
    ## Other Stuff happens
    ##
  }
  ##
  ## So I assume this always happens
  ##
}

function doStuff {
  if (Y) {
    ##
    ## Stuff happens
    ##
  }
  else {
    ##
    ## Other Stuff happens
    return; 
    # ^- this is easy to spot when scanning
    ##
  }
  ##
  ## This *usually* happens
  ##
}

我更喜欢后者,即使它可能有点多余

我确实接受这一点,主要是因为我认为'返回'作为一个重要的关键词的条件超过100倍,而不是我期待例外的次数,但我可以发现一个独立的'回归'。 (或'break;',甚至'继续;')更快在屏幕代码中比我可以选择“抛出新异常(xxx,yyy);”在快速滚动的距离。

如果我处理代码,其中异常处理是很多更频繁的流程管理方法,我可能会更加敏感地发现'throw'作为关键字,但我是不

但是,我也犯了多余的路标,如:

function doStuff() {
  if (X) {
    ## Do this
  }
  else {
    ## Do that
  }
  /* Should not get here. */
  return NULL;
}

...但仅限于上述逻辑难以遵循的极端情况,,例如预期会有早期退出。