在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"被认为是未知的,仍然抛出逻辑异常?
逻辑异常用于编译时发生的错误。因为PHP没有编译时间,所以它通常被解释为"开发过程中发生的错误",(比如当开发人员忘记传递依赖项或其他东西时),而运行时异常是针对代码运行时不可预见的错误(通常源于用户输入)。
但是坦率地说,整个Spl Exception层次结构是Fubar。所以,使用你想要的,或者创建你自己的。
参见https://wiki.php.net/rfc/spl-improvements/exceptions
我将使用域,因为数据集是静态的(因此在setFoo()
中检查)。如果数据集是动态的,我会使用unexpectedvalue
(因此在doSomethingWithFoo()
中进行检查)。