4

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

4

2 回答 2

12

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

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

另请参阅https://wiki.php.net/rfc/spl-improvements/exceptions

于 2013-01-05T12:38:29.710 回答
0

我将使用这个,因为数据集是静态的(因此签入setFoo())......unexpectedvalue如果数据集是动态的(因此签入),我会选择doSomethingWithFoo()

于 2013-01-05T13:28:04.003 回答