在PHP中,如果某个值被视为“未知”(本身无效),是否会引发逻辑或运行时异常?
<?php
function foo($bar) {
// logic
if(!is_string($bar)) {
throw new \InvalidArgumentException('invalid *argument*');
}
if(strlen($bar) < 4) {
throw new \DomainException('invalid *bar*');
}
static $knownBars = array('bar1', 'bar2');
if(!in_array($knownBars)) {
throw new \DomainException('unknown *bar*');
//throw new \UnexpectedValueException('unknown *bar*');
}
// runtime
$bar;
}
前两个例外很明显,但最后一个例子对我来说仍然有点不清楚。两者似乎都有意义;逻辑/域错误,因为我们期望定义的数据集之一,运行时/意外值错误,因为我们实际上得到了一个意外的值。
我应该扔哪一个?
此外,如果逻辑部分是单个setter方法,并且我们想用数据库查找替换静态数组(数据集)...是否可以在逻辑代码中期望运行时异常,因为数据库失败等等?或者我们应该将数据库查找移动到运行时代码,如果“bar”被认为是未知的,还是会抛出逻辑异常吗?
答案 0 :(得分:10)
逻辑异常是针对编译时发生的错误。由于PHP在某种意义上没有编译时间,因此它通常被解释为“在开发期间发生的错误”,(例如当开发人员忘记传递依赖性或其他东西时),而运行时异常是针对不可预见的错误(通常源于用户)输入)代码运行时。
但坦率地说,整个Spl Exception层次结构都是Fubar。所以,只需使用您想要的或创建自己的。
答案 1 :(得分:0)
由于数据集是静态的(并且因此在setFoo()中检查过),我将使用域来进行此操作...如果数据集是动态的,我会使用unexpectedvalue(因此在doSomethingWithFoo中检查了) ))。