27

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

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

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

4

4 回答 4

35

无法访问的代码

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

于 2012-07-18T18:34:43.533 回答
5

因为他们犯了一个错误,或者这是他们的个人喜好。无法访问return该代码中的内容,但包含它并没有真正的危害。

文档 (强调我的)

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

于 2012-07-18T18:13:19.490 回答
4

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

于 2012-07-18T18:21:32.823 回答
4

我发现这个约定很有用,因为在尝试读取现有代码时,提前退出可能会破坏对代码流的期望。并且经常值得被标记。这几乎是一个goto。

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

比较:

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
  ##
}

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

我确实接受这主要是因为我将“return”视为一个重要关键字的条件要高出 100 倍,而我不得不期待例外的次数,但我可以发现一个独立的“return”;(或'break;',甚至'continue;')在一屏代码中比我能挑出“throw new Exception(xxx,yyy);”要快得多 快速滚动时在远处。

如果我处理的代码中异常处理是一种常见的流程管理方法,我可能会更敏感地发现“throw”作为关键字,但我不是。

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

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

... but only in extreme cases where the above logic is hard to follow, such as when there were early exits expected.

于 2014-01-06T04:14:33.403 回答