我在Github的一些代码中看到了
if($something_funky_happens){
throw new \LogicException(...);
return;
}
这是必需的,还是不重要的? 因为我知道在你抛出异常后脚本停止了,所以进一步的代码不会运行
答案 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;
}
...但仅限于上述逻辑难以遵循的极端情况,,例如预期会有早期退出。