我在 Github 上的一些代码中看到
if($something_funky_happens){
throw new \LogicException(...);
return;
}
这是必需的,还是退货不重要?因为我知道在你抛出异常后脚本会停止,所以进一步的代码不会运行
我倾向于在他们的代码中表示它是一个错误。该语句不可访问。每个静态代码分析工具都会抱怨这个无法访问的语句。即使在这种情况下它没有任何危害,您在检查代码时也会收到大量警告。如果您关闭这些警告类型,您可能会错过代码中的其他逻辑错误。这是一种真正的难闻气味,需要修复。
因为他们犯了一个错误,或者这是他们的个人喜好。无法访问return
该代码中的内容,但包含它并没有真正的危害。
从文档 (强调我的):
当抛出异常时,语句后面的代码将不会被执行,PHP 将尝试找到第一个匹配的 catch 块。
我想这只是为了更好的可读性......所以如果你假装每个退出点都被一个新行分隔,你可以更快地扫描代码以查找退出点。
我发现这个约定很有用,因为在尝试读取现有代码时,提前退出可能会破坏对代码流的期望。并且经常值得被标记。这几乎是一个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.