PHP运行时或逻辑异常?

时间:2013-01-05 12:21:09

标签: php exception runtime logic

在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”被认为是未知的,还是会抛出逻辑异常吗?

2 个答案:

答案 0 :(得分:10)

逻辑异常是针对编译时发生的错误。由于PHP在某种意义上没有编译时间,因此它通常被解释为“在开发期间发生的错误”,(例如当开发人员忘记传递依赖性或其他东西时),而运行时异常是针对不可预见的错误(通常源于用户)输入)代码运行时。

但坦率地说,整个Spl Exception层次结构都是Fubar。所以,只需使用您想要的或创建自己的。

另见https://wiki.php.net/rfc/spl-improvements/exceptions

答案 1 :(得分:0)

由于数据集是静态的(并且因此在setFoo()中检查过),我将使用域来进行此操作...如果数据集是动态的,我会使用unexpectedvalue(因此在doSomethingWithFoo中检查了) ))。